【问题标题】:PostgreSQL 12 - foreign key on partitioning tables ErrorPostgreSQL 12 - 分区表上的外键错误
【发布时间】:2019-10-11 17:21:30
【问题描述】:

参考 V11 - PostgreSQL 11 foreign key on partitioning tables

在 V12 中也出现类似错误。

下面是我的测试表和PK和FK。

CREATE TABLE prod (id bigint NOT NULL, week bigint NOT NULL) PARTITION BY RANGE (week);
CREATE TABLE prod_w1 PARTITION OF prod FOR VALUES FROM (1) TO (2);
CREATE TABLE prod_w2 PARTITION OF prod FOR VALUES FROM (2) TO (3);
CREATE TABLE prod_w3 PARTITION OF prod FOR VALUES FROM (3) TO (4);
ALTER TABLE prod ADD CONSTRAINT xpk_prod PRIMARY KEY (id, week);
CREATE TABLE cust (id bigint NOT NULL, pid bigint Not NULL, week bigint NOT NULL) PARTITION BY RANGE (week);
CREATE TABLE cust_w1 PARTITION OF cust FOR VALUES FROM (1) TO (2);
CREATE TABLE cust_w2 PARTITION OF cust FOR VALUES FROM (2) TO (3);
CREATE TABLE cust_w3 PARTITION OF cust FOR VALUES FROM (3) TO (4);
ALTER TABLE cust ADD CONSTRAINT xpk_cust PRIMARY KEY (id, pid, week);
ALTER TABLE cust ADD CONSTRAINT xfk_cust FOREIGN KEY (pid) REFERENCES prod(pid) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

这里最后一个ALTER TABLE 命令出现错误:

ERROR:  cannot reference partitioned table "prod"

您能否检查 V12 或任何补丁并帮助我解决此错误。

【问题讨论】:

    标签: postgresql foreign-keys partitioning


    【解决方案1】:

    这在 PostgreSQL v11 中不起作用,因为仅从 v12 开始支持引用分区表的外键。

    您的最后一条语句在 PostgreSQL v12 中也不起作用,但原因不同:

    • prod 中没有列pid(错字)。

    • 外键必须引用目标表中的整个唯一键或主键,而不仅仅是其中的一列。

    此语句在 PostgreSQL v12 中可以正常工作:

    ALTER TABLE cust
       ADD CONSTRAINT xfk_cust
          FOREIGN KEY (pid, week) REFERENCES prod(id, week)
          ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
    

    【讨论】:

    • 在线示例:dbfiddle.uk/…
    • 非常令人失望,我无法相信这种半生不熟的东西会投入生产。对于大量用例来说,这是一个严重的限制……我正在尝试在 PG12 安装中使用这种解决方法。 depesz.com/2019/04/24/…
    • @KevinParker 不知道你在说什么,但我想这并不重要,你只是想发泄一下。
    • 是的,这浪费了我数周的时间,因为 postgres 需要大量的手来开箱即用地正常工作...... depesz 的解决方法有效并且外键约束保持在引用表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多