PostgreSql错误:列引用在ADD CONSTRAINT外键中不明确

时间:2014-12-12 16:49:43

标签: postgresql foreign-keys ambiguous

如何才能收到此错误?情况是这样的: 表a具有列a,b,c,e,...并且pkey是a,b,c。 表b具有列a,b,c和d,并且pkey是a,b,c,d

ALTER TABLE b ADD CONSTRAINT a_b_fkey FOREIGN KEY (a, b, c) REFERENCES a (a,b,c)

ERROR: column reference "b" is ambiguous.

我错过了什么吗?这似乎没有任何意义。

1 个答案:

答案 0 :(得分:0)

postgres作为alter语句的一部分运行的有问题的基础查询是:

SELECT 
    fk."a",
    fk."b",
    fk."c"
FROM ONLY "public"."b" fk 
JOIN ONLY "public"."a" pk 
    ON ( pk."a" OPERATOR(pg_catalog.=) fk."a" 
        AND pk."b" OPERATOR(pg_catalog.=) fk."b" 
        AND pk."c" OPERATOR(pg_catalog.=) fk."c")
WHERE pk."a" IS NULL
    AND (fk."a" IS NOT NULL 
        AND fk."b" IS NOT NULL
        AND fk."b" IS NOT NULL);

所以我更改了名称,但显然两个表中列“b”的名称实际上是“rowid”非常重要。在与我的DBA谈了一段时间后,我们猜测可能rowid是postgres中的保留字,或者至少bug与此有关。事实证明这是;我将两个表中的列重命名为“row_id”,问题得到解决。不起作用:

SELECT 
    fk."templateid",
    fk."rowid",
    fk."colid"
FROM ONLY "public"."b" fk 
JOIN ONLY "public"."a" pk 
    ON ( pk."templateid" OPERATOR(pg_catalog.=) fk."templateid" 
        AND pk."rowid" OPERATOR(pg_catalog.=) fk."rowid" 
        AND pk."colid" OPERATOR(pg_catalog.=) fk."colid")
WHERE pk."templateid" IS NULL
    AND (fk."templateid" IS NOT NULL 
        AND fk."rowid" IS NOT NULL
        AND fk."colid" IS NOT NULL);

作品:

SELECT 
    fk."templateid",
    fk."row_id",
    fk."col_id"
FROM ONLY "public"."b" fk 
JOIN ONLY "public"."a" pk 
    ON ( pk."templateid" OPERATOR(pg_catalog.=) fk."templateid" 
        AND pk."row_id" OPERATOR(pg_catalog.=) fk."row_id" 
        AND pk."col_id" OPERATOR(pg_catalog.=) fk."col_id")
WHERE pk."templateid" IS NULL
    AND (fk."templateid" IS NOT NULL 
        AND fk."row_id" IS NOT NULL
        AND fk."col_id" IS NOT NULL);

(我刚刚更改了colid以命名一致性,但这并没有导致问题)