I think I read somewhere that running an ALTER TABLE foo ADD COLUMN baz text
on a postgres database will not cause a read or write lock. Setting a default value causes locking, but allowing a null default prevents a lock.
I can't find this in the documentation, though. Can anyone point to a place that says, definitively, if this is true or not?
The different sorts of locks and when they're used are mentioned in the doc in
Table-level Locks. For instance, Postgres 11's ALTER TABLE
may acquire a SHARE UPDATE EXCLUSIVE
, SHARE ROW EXCLUSIVE
, or ACCESS EXCLUSIVE
lock.
Postgres 9.1 through 9.3 claimed to support two of the above three but actually forced Access Exclusive
for all variants of this command. This limitation was lifted in Postgres 9.4 but ADD COLUMN
remains at ACCESS EXCLUSIVE
by design.
It's easy to check in the source code because there's a function dedicated to establishing the lock level needed for this command in various cases: AlterTableGetLockLevel
in src/backend/commands/tablecmds.c
.
Concerning how much time the lock is held, once acquired: