ALTER TABLEコマンドは各サブコマンドによってテーブルへのロックレベルが異なります。ソースを見るのが一番正確なのですが、いつも確認するのが面倒なのでまとめてみました。

※ PostgreSQL 15 の情報です。

PostgreSQLのロックレベルはこちらに載っています。ALTER TABLEに関連する主なロックレベルと、大体の雰囲気は以下の通り。

  • AccessExclusiveLock: SELECTさえもできなくなる、一番強いロック。
  • ShareRowExclusiveLock: SELECTはできるけど、UPDATE、DELETE、INSERTはできない。同じコマンド同士も競合する。
  • ShareUpdateExclusiveLock: SELECT、INSERT、UPDATE、DELETEはできる。同じコマンド同士は競合する。

基本的にテーブルの書き換えが必要なもの(例えば列のデータ型をINTからTEXTにするなど)は、AccessExclusiveLockが必要となります。ただ、一部ShareRowExsluveLockShareUpdateExclusiveLockなどの弱いロックが使われていて、SELECTやINSERT、UPDATE、DELETEが同時に実行できる、というイメージ。

ALTER TABLEのサブコマンドとロックレベルの一覧(PostgreSQL 15版)

サブコマンド ロックレベル
ADD COLUMN AccessExclusiveLock
ATTACH PARTITION ShareUpdateExclusiveLock
DROP COLUMN AccessExclusiveLock
ALTER COLUMN … SET DATA TYPE AccessExclusiveLock
ALTER COLUMN … SET DEFAULT AccessExclusiveLock
ALTER COLUMN … DROP DEFAULT AccessExclusiveLock
ALTER COLUMN … SET NOT NULL AccessExclusiveLock
ALTER COLUMN … DROP NOT NULL AccessExclusiveLock
ALTER COLUMN … DROP EXPRESSION AccessExclusiveLock
ALTER COLUMN … ADD GENERATED AS IDENTITY AccessExclusiveLock
ALTER COLUMN … SET GENERATED AccessExclusiveLock
ALTER COLUMN … DROP IDENTITY AccessExclusiveLock
ALTER COLUMN … SET STATISTICS ShareUpdateExclusiveLock
ALTER COLUMN … SET (…) ShareUpdateExclusiveLock
ALTER COLUMN … RESET (…) ShareUpdateExclusiveLock
ALTER COLUMN … SET STORAGE AccessExclusiveLock
ALTER COLUMN … SET COMPRESSION AccessExclusiveLock
ADD table_constraint AccessExclusiveLock or ShareRowExclusiveLock 1
ALTER CONSTRAINT … AccessExclusiveLock
VALIDATE CONSTRAINT ShareUpdateExclusiveLock
DETACH PARTITION ShareUpdateExclusiveLock or AccessExclusiveLock 2
DROP CONSTRAINT AccessExclusiveLock
DISABLE TRIGGER ShareRowExclusiveLock
ENABLE TRIGGER ShareRowExclusiveLock
ENABLE REPLICA TRIGGER ShareRowExclusiveLock
ENABLE ALWAYS TRIGGER ShareRowExclusiveLock
DISABLE RULE AccessExclusiveLock
ENABLE RULE AccessExclusiveLock
ENABLE REPLICA RULE AccessExclusiveLock
ENABLE ALWAYS RULE AccessExclusiveLock
DISABLE ROW LEVEL SECURITY AccessExclusiveLock
ENABLE ROW LEVEL SECURITY AccessExclusiveLock
NO FORCE ROW LEVEL SECURITY AccessExclusiveLock
CLUSTER ON ShareUpdateExclusiveLock
SET WITHOUT CLUSTER ShareUpdateExclusiveLock
SET WITHOUT OIDS AccessExclusiveLock
SET ACCESS METHOD AccessExclusiveLock
SET TABLESPACE AccessExclusiveLock
SET LOGGED/UNLOGGED AccessExclusiveLock
SET (…) パラメータによって異なる(大体がShareUpdateExclusiveLock、たまにAccessExclusiveLock
RESET (…) パラメータによって異なる(大体がShareUpdateExclusiveLock、たまにAccessExclusiveLock
INHERIT AccessExclusiveLock
NO INHERIT AccessExclusiveLock
OF AccessExclusiveLock
NOT OF AccessExclusiveLock
OWNER TO AccessExclusiveLock
RENAME AccessExclusiveLock
REPLICA IDENTITY AccessExclusiveLock
SET SCHEMA AccessExclusiveLock
SET TABLESPACE AccessExclusiveLock
   

抜け漏れ、誤り等あればぜひご指摘ください。

  1. 外部キーに関するものの場合はShareRowExclusiveLock、それ以外(主キーなど)はAccessExclusiveLock 

  2. CONCURRENTLYオプションがついていればShareUpdateExclusiveLock、そうでない場合はAccessExclusiveLock