我知道添加外键约束需要进行表扫描并对SHARE ROW EXCLUSIVE
两个表进行锁定。
为了防止可能冗长的表扫描,可以使用该方法添加约束NOT VALID
。但我想知道,在添加新列时,是否也应该使用NOT VALID
,或者 Postgres 是否足够智能,可以识别出这是一个新列,因此不需要扫描整个表?
我正在使用Django,添加外键列的生成的SQL如下所示:
ALTER TABLE
"example"
ADD
COLUMN "new_column_id" integer NULL CONSTRAINT "example_new_column_id_fk" REFERENCES "another_table"("id") DEFERRABLE INITIALLY DEFERRED;
SET
CONSTRAINTS "example_new_column_id_b781b6be_fk" IMMEDIATE;