在 Postgresql 分区表上添加外键的最佳方法是什么?
第一种方法
在子表上添加外键始终为 NOT VALID。
ALTER TABLE <partition_name> ADD CONSTRAINT <foreign_key_name>
FOREIGN KEY (someId) REFERENCES reftable(someId) NOT VALID;
验证子表上的外键。
ALTER TABLE <partition_name> VALIDATE CONSTRAINT <foreign_key_name>;
在父表上创建外键。
ALTER TABLE <parent_table_name> ADD CONSTRAINT <foreign_key_name>
FOREIGN KEY (someId) REFERENCES reftable(someId);
第二种方法
在父表上添加外键为 NOT VALID。
ALTER TABLE <parent_table_name> ADD CONSTRAINT <foreign_key_name>
FOREIGN KEY (someId) REFERENCES reftable(someId) NOT VALID;
验证父表上的外键:
ALTER TABLE <parent_table_name> VALIDATE CONSTRAINT <foreign_key_name>;
答案很简单:第二种方法是不可能的,并且会导致错误
ERROR: cannot add NOT VALID foreign key on partitioned table "<parent_table_name>" referencing relation "reftable"
DETAIL: This feature is not yet supported on partitioned tables.
因此,通过排除,第一种方法是更好的方法。它还最大限度地减少锁定:只有在分区表上创建约束的最后一条语句需要与数据修改冲突的锁,并且该语句将非常快。