CHECK
和FK
约束已添加NOT VALID
功能。相关链接:http://dba.stackexchange.com/questions/75613/disable-all-constraints-and-table-checks-while-restoring-a-dump/75635#75635 或 http://dba.stackexchange.com/questions/158499/postgres-how-is-set-not-null-more-efficient-than-check-constraint - Erwin Brandstetter一种可能的替代方法是使用 NOT VALID
创建一个检查约束,然后稍后验证该检查约束。这种方法只需要在创建约束时持有一个 ACCESS EXCLUSIVE
锁,持续时间应该在毫秒级别。VALIDATE
命令将执行一个耗时较长的全表扫描以验证约束,但它持有一个较不严格的 SHARE UPDATE EXCLUSIVE
锁。
至于权衡,我未能找到任何文件提及标准的 NOT NULL
约束和验证列非空的检查约束之间的内部机制差异。我记得曾经挖掘过一个论坛帖子,暗示可能存在性能差异,但我已经找不到链接了,所以这个信息尚未确认。
ALTER TABLE table ADD CONSTRAINT table_value_not_null_check CHECK (value IS NOT NULL) NOT VALID;
ALTER TABLE table VALIDATE CONSTRAINT table_value_not_null_check;
来源:
https://www.postgresql.org/docs/9.4/static/sql-altertable.html https://www.postgresql.org/docs/9.4/static/explicit-locking.html
NOT NULL
约束和检查约束之间的区别:https://dba.stackexchange.com/questions/158499/postgres-how-is-set-not-null-more-efficient-than-check-constraint - stereoscott