# Checks
diesel-guard ships safety checks covering the most common Postgres migration hazards.
| [Add Check Constraint](add-check-constraint.md) | `ALTER TABLE ... ADD CONSTRAINT ... CHECK` without `NOT VALID` | ACCESS EXCLUSIVE |
| [ADD COLUMN with DEFAULT](add-column-default.md) | `ALTER TABLE ... ADD COLUMN ... DEFAULT` | ACCESS EXCLUSIVE + table rewrite |
| [Adding an EXCLUDE Constraint](add-exclude-constraint.md) | `ALTER TABLE ... ADD CONSTRAINT ... EXCLUDE` | SHARE ROW EXCLUSIVE + full table scan |
| [Add Foreign Key](add_foreign_key.md) | `ALTER TABLE ... ADD FOREIGN KEY` without `NOT VALID` | ShareRowExclusiveLock |
| [Adding an Index](adding-index.md) | `CREATE INDEX` without `CONCURRENTLY`; `CREATE INDEX CONCURRENTLY` inside a transaction | SHARE |
| [Adding a UNIQUE Constraint](adding-unique-constraint.md) | `ALTER TABLE ... ADD UNIQUE` | ACCESS EXCLUSIVE |
| [Changing Column Type](changing-column-type.md) | `ALTER TABLE ... ALTER COLUMN ... TYPE` | ACCESS EXCLUSIVE + table rewrite |
| [CHAR Fields](char-field.md) | `CHAR`/`CHARACTER` column types | — (best practice) |
| [Create Table with SERIAL](create-table-serial.md) | `SERIAL/BIGSERIAL/SMALLSERIAL` in `CREATE TABLE` | — (best practice) |
| [Creating an Extension](creating-extension.md) | `CREATE EXTENSION` | — (requires superuser) |
| [Domain CHECK Constraint](add-domain-check-constraint.md) | `ALTER DOMAIN ... ADD CONSTRAINT ... CHECK` without `NOT VALID` | ACCESS EXCLUSIVE |
| [Dropping a Column](dropping-column.md) | `ALTER TABLE ... DROP COLUMN` | ACCESS EXCLUSIVE |
| [Dropping a Constraint](dropping-constraint.md) | Unnamed `UNIQUE`/`FOREIGN KEY`/`CHECK` constraints | — (best practice) |
| [Dropping a Database](dropping-database.md) | `DROP DATABASE` | Exclusive access |
| [Dropping an Index](dropping-index.md) | `DROP INDEX` without `CONCURRENTLY`; `DROP INDEX CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [Dropping a Primary Key](dropping-primary-key.md) | `ALTER TABLE ... DROP CONSTRAINT ... pkey` | ACCESS EXCLUSIVE |
| [Dropping a Table](dropping-table.md) | `DROP TABLE` | ACCESS EXCLUSIVE |
| [Generated Columns](generated-column.md) | `ADD COLUMN ... GENERATED ALWAYS AS ... STORED` | ACCESS EXCLUSIVE + table rewrite |
| [JSON Fields](json-field.md) | `ADD COLUMN ... JSON` | — (best practice) |
| [Mutation without WHERE](mutation-without-where.md) | `DELETE FROM table` or `UPDATE table SET ...` without `WHERE` | ACCESS EXCLUSIVE / ROW EXCLUSIVE |
| [Wide Indexes](multiple-column-index.md) | `CREATE INDEX` with 4+ columns | — (best practice) |
| [REFRESH MATERIALIZED VIEW](refresh-materialized-view.md) | `REFRESH MATERIALIZED VIEW` without `CONCURRENTLY`; `REFRESH MATERIALIZED VIEW CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [Renaming a Column](renaming-column.md) | `ALTER TABLE ... RENAME COLUMN` | ACCESS EXCLUSIVE |
| [Renaming a Schema](renaming-schema.md) | `ALTER SCHEMA ... RENAME TO` | ACCESS EXCLUSIVE |
| [Renaming a Table](renaming-table.md) | `ALTER TABLE ... RENAME TO` | ACCESS EXCLUSIVE |
| [REINDEX](reindexing.md) | `REINDEX` without `CONCURRENTLY`; `REINDEX CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [SERIAL Primary Keys](serial-primary-key.md) | `ADD COLUMN ... SERIAL/BIGSERIAL` | ACCESS EXCLUSIVE + table rewrite |
| [SET NOT NULL](set-not-null.md) | `ALTER TABLE ... ALTER COLUMN ... SET NOT NULL` | ACCESS EXCLUSIVE |
| [Short Primary Keys](short-primary-key.md) | `SMALLINT`/`INT` primary keys | — (best practice) |
| [TIMESTAMP Fields](timestamp-field.md) | `TIMESTAMP` without time zone | — (best practice) |
| [TRUNCATE TABLE](truncating-table.md) | `TRUNCATE TABLE` | ACCESS EXCLUSIVE |
| [Unnamed Constraints](unnamed-constraint.md) | Constraints without explicit names | — (best practice) |
Need project-specific rules beyond these? See [Custom Checks](../custom-checks.md).