Reference
Postgres lock mode reference
68 DDL patterns, one page per statement. Each one has the exact PostgreSQL lock mode it takes, what it blocks, pgfence's risk level, and a safe rewrite when one exists. For the narrative version of this table, see the lock mode cheat sheet and the DDL lock cheat sheet.
Columns
ADD COLUMN ... NOT NULL without DEFAULT
Blocks reads, writes, DDL
ADD COLUMN ... DEFAULT <volatile expression>
Blocks reads, writes, DDL
ADD COLUMN ... DEFAULT <constant>
Blocks reads, writes, DDL
ADD COLUMN ... DEFAULT now() (stable/current-value functions)
Blocks reads, writes, DDL
ADD COLUMN ... DEFAULT on PostgreSQL < 11
Blocks reads, writes, DDL
ADD COLUMN ... GENERATED ALWAYS AS (...) STORED
Blocks reads, writes, DDL
ADD COLUMN ... GENERATED ALWAYS AS IDENTITY
Blocks reads, writes, DDL
ADD COLUMN ... REFERENCES (inline foreign key)
Blocks reads, writes, DDL
ADD COLUMN ... REFERENCES ... NOT VALID (inline)
Blocks reads, writes, DDL
ADD COLUMN using a constrained domain type
Blocks reads, writes, DDL
ALTER COLUMN ... TYPE
Blocks reads, writes, DDL
ALTER COLUMN ... SET NOT NULL
Blocks reads, writes, DDL
ALTER COLUMN ... DROP NOT NULL
Blocks reads, writes, DDL
Renaming
Indexes
CREATE INDEX without CONCURRENTLY
Blocks writes, DDL
DROP INDEX without CONCURRENTLY
Blocks reads, writes, DDL
REINDEX TABLE without CONCURRENTLY
Blocks writes, DDL
REINDEX INDEX without CONCURRENTLY
Blocks reads, writes, DDL
REINDEX SCHEMA or REINDEX DATABASE without CONCURRENTLY
Blocks reads, writes, DDL
Constraints
ADD CONSTRAINT ... FOREIGN KEY without NOT VALID
Blocks writes, DDL
ADD CONSTRAINT ... CHECK without NOT VALID
Blocks reads, writes, DDL
ADD CONSTRAINT ... CHECK ... NOT VALID
Blocks reads, writes, DDL
ADD CONSTRAINT ... UNIQUE
Blocks reads, writes, DDL
ADD CONSTRAINT ... UNIQUE USING INDEX
Blocks reads, writes, DDL
ADD CONSTRAINT ... PRIMARY KEY without USING INDEX
Blocks reads, writes, DDL
ADD CONSTRAINT ... PRIMARY KEY USING INDEX
Blocks reads, writes, DDL
ADD CONSTRAINT ... EXCLUDE
Blocks reads, writes, DDL
CREATE TABLE ... with an inline EXCLUDE constraint
Blocks writes, DDL
VALIDATE CONSTRAINT (standalone)
Blocks DDL
Domains
Destructive Operations
DROP TABLE
Blocks reads, writes, DDL
ALTER TABLE ... DROP COLUMN
Blocks reads, writes, DDL
ALTER TABLE ... DROP CONSTRAINT
Blocks reads, writes, DDL
DROP SCHEMA
Blocks reads, writes, DDL
DROP SCHEMA ... CASCADE
Blocks reads, writes, DDL
TRUNCATE
Blocks reads, writes, DDL
TRUNCATE ... CASCADE
Blocks reads, writes, DDL
DELETE without WHERE
Blocks DDL
DROP DATABASE
Blocks reads, writes, DDL
VACUUM FULL
Blocks reads, writes, DDL
ALTER TABLE ... SET LOGGED / SET UNLOGGED
Blocks reads, writes, DDL
Partitions
ALTER TABLE ... ATTACH PARTITION
Blocks DDL
ALTER TABLE ... ATTACH PARTITION on PostgreSQL 11 and earlier
Blocks reads, writes, DDL
ALTER TABLE ... DETACH PARTITION
Blocks reads, writes, DDL
ALTER TABLE ... DETACH PARTITION CONCURRENTLY
Blocks DDL
Materialized Views
Triggers
Enums
Row-Level Security
ALTER TABLE ... ENABLE ROW LEVEL SECURITY
Blocks reads, writes, DDL
ALTER TABLE ... DISABLE ROW LEVEL SECURITY
Blocks reads, writes, DDL
ALTER TABLE ... FORCE ROW LEVEL SECURITY
Blocks reads, writes, DDL
ALTER TABLE ... NO FORCE ROW LEVEL SECURITY
Blocks reads, writes, DDL
CREATE POLICY
Blocks reads, writes, DDL
ALTER POLICY
Blocks reads, writes, DDL
DROP POLICY
Blocks reads, writes, DDL