mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
Add Foreign Key Constraint Without A Full Lock as a postgres til
This commit is contained in:
@@ -9,7 +9,7 @@ and pairing with smart people at Hashrocket.
|
|||||||
|
|
||||||
For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud).
|
For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud).
|
||||||
|
|
||||||
_862 TILs and counting..._
|
_863 TILs and counting..._
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -383,6 +383,7 @@ _862 TILs and counting..._
|
|||||||
### PostgreSQL
|
### PostgreSQL
|
||||||
|
|
||||||
- [A Better Null Display Character](postgres/a-better-null-display-character.md)
|
- [A Better Null Display Character](postgres/a-better-null-display-character.md)
|
||||||
|
- [Add Foreign Key Constraint Without A Full Lock](postgres/add-foreign-key-constraint-without-a-full-lock.md)
|
||||||
- [Add ON DELETE CASCADE To Foreign Key Constraint](postgres/add-on-delete-cascade-to-foreign-key-constraint.md)
|
- [Add ON DELETE CASCADE To Foreign Key Constraint](postgres/add-on-delete-cascade-to-foreign-key-constraint.md)
|
||||||
- [Adding Composite Uniqueness Constraints](postgres/adding-composite-uniqueness-constraints.md)
|
- [Adding Composite Uniqueness Constraints](postgres/adding-composite-uniqueness-constraints.md)
|
||||||
- [Aggregate A Column Into An Array](postgres/aggregate-a-column-into-an-array.md)
|
- [Aggregate A Column Into An Array](postgres/aggregate-a-column-into-an-array.md)
|
||||||
|
|||||||
31
postgres/add-foreign-key-constraint-without-a-full-lock.md
Normal file
31
postgres/add-foreign-key-constraint-without-a-full-lock.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Add Foreign Key Constraint Without A Full Lock
|
||||||
|
|
||||||
|
Adding a foreign key constraint to a large production table can cause a full
|
||||||
|
table lock resulting in downtime. This is because the entire table needs to be
|
||||||
|
scanned to check that the constraint is valid.
|
||||||
|
|
||||||
|
The amount of locking, and ultimately the impact on your app, can be reduced by
|
||||||
|
spreading this action across two commands. First is to add the constraint
|
||||||
|
without checking that all the existing records are valid.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
alter table books
|
||||||
|
add constraint fk_books_authors
|
||||||
|
foreign key (author_id)
|
||||||
|
references authors(id)
|
||||||
|
not valid;
|
||||||
|
```
|
||||||
|
|
||||||
|
The constraint will be added immediately and any subsequent inserts or updates
|
||||||
|
will be subject to the new foreign key constraint.
|
||||||
|
|
||||||
|
The second step is to make this constraint valid for all the existing rows.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
alter table books validate constraint fk_books_authors;
|
||||||
|
```
|
||||||
|
|
||||||
|
This "validation acquires only a SHARE UPDATE EXCLUSIVE lock on the table being
|
||||||
|
altered." This is lower impact than a full table lock.
|
||||||
|
|
||||||
|
[Source](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-NOTES)
|
||||||
Reference in New Issue
Block a user