Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Checks

diesel-guard ships safety checks covering the most common Postgres migration hazards.

CheckOperationLock Type
Add Check ConstraintALTER TABLE ... ADD CONSTRAINT ... CHECK without NOT VALIDACCESS EXCLUSIVE
ADD COLUMN with DEFAULTALTER TABLE ... ADD COLUMN ... DEFAULTACCESS EXCLUSIVE + table rewrite
Adding an EXCLUDE ConstraintALTER TABLE ... ADD CONSTRAINT ... EXCLUDESHARE ROW EXCLUSIVE + full table scan
Add Foreign KeyALTER TABLE ... ADD FOREIGN KEY without NOT VALIDShareRowExclusiveLock
Adding an IndexCREATE INDEX without CONCURRENTLY; CREATE INDEX CONCURRENTLY inside a transactionSHARE
Adding a UNIQUE ConstraintALTER TABLE ... ADD UNIQUEACCESS EXCLUSIVE
Changing Column TypeALTER TABLE ... ALTER COLUMN ... TYPEACCESS EXCLUSIVE + table rewrite
CHAR FieldsCHAR/CHARACTER column types— (best practice)
Create Table with SERIALSERIAL/BIGSERIAL/SMALLSERIAL in CREATE TABLE— (best practice)
Creating an ExtensionCREATE EXTENSION— (requires superuser)
Domain CHECK ConstraintALTER DOMAIN ... ADD CONSTRAINT ... CHECK without NOT VALIDACCESS EXCLUSIVE
Dropping a ColumnALTER TABLE ... DROP COLUMNACCESS EXCLUSIVE
Dropping a ConstraintUnnamed UNIQUE/FOREIGN KEY/CHECK constraints— (best practice)
Dropping a DatabaseDROP DATABASEExclusive access
Dropping an IndexDROP INDEX without CONCURRENTLY; DROP INDEX CONCURRENTLY inside a transactionACCESS EXCLUSIVE
Dropping a Primary KeyALTER TABLE ... DROP CONSTRAINT ... pkeyACCESS EXCLUSIVE
Dropping a TableDROP TABLEACCESS EXCLUSIVE
Generated ColumnsADD COLUMN ... GENERATED ALWAYS AS ... STOREDACCESS EXCLUSIVE + table rewrite
JSON FieldsADD COLUMN ... JSON— (best practice)
Mutation without WHEREDELETE FROM table or UPDATE table SET ... without WHEREACCESS EXCLUSIVE / ROW EXCLUSIVE
Wide IndexesCREATE INDEX with 4+ columns— (best practice)
REFRESH MATERIALIZED VIEWREFRESH MATERIALIZED VIEW without CONCURRENTLY; REFRESH MATERIALIZED VIEW CONCURRENTLY inside a transactionACCESS EXCLUSIVE
Renaming a ColumnALTER TABLE ... RENAME COLUMNACCESS EXCLUSIVE
Renaming a SchemaALTER SCHEMA ... RENAME TOACCESS EXCLUSIVE
Renaming a TableALTER TABLE ... RENAME TOACCESS EXCLUSIVE
REINDEXREINDEX without CONCURRENTLY; REINDEX CONCURRENTLY inside a transactionACCESS EXCLUSIVE
SERIAL Primary KeysADD COLUMN ... SERIAL/BIGSERIALACCESS EXCLUSIVE + table rewrite
SET NOT NULLALTER TABLE ... ALTER COLUMN ... SET NOT NULLACCESS EXCLUSIVE
Short Primary KeysSMALLINT/INT primary keys— (best practice)
TIMESTAMP FieldsTIMESTAMP without time zone— (best practice)
TRUNCATE TABLETRUNCATE TABLEACCESS EXCLUSIVE
Unnamed ConstraintsConstraints without explicit names— (best practice)

Need project-specific rules beyond these? See Custom Checks.