如何才能收到此错误?情况是这样的: 表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.
我错过了什么吗?这似乎没有任何意义。
答案 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以命名一致性,但这并没有导致问题)