Postgresql
為什麼複合外鍵需要單獨的唯一約束?
這是一個簡單的表,其中記錄可以引用同一表中的父記錄:
CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) );
加上其他欄位值之一(
num
)在父記錄和子記錄之間必須相同的附加要求,我認為複合外鍵應該可以解決問題。我將最後一行更改為FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
並得到ERROR: there is no unique constraint matching given keys for referenced table “foo”。
我可以很容易地添加這個約束,但我不明白為什麼它是必要的,當引用的列之一 (
id
) 已經保證是唯一的時?在我看來,新的約束將是多餘的。
這是 DBMS 的一個限制——據我所知,在所有這些中。不僅在添加列時,而且在重新排列列時。如果我們對 有一個
UNIQUE
約束(a1, a2)
,我們就不能添加一個FOREIGN KEY
thatREFERENCES (a2, a1)
除非有一個唯一的約束,(a2, a1)
它本質上是多餘的。將其添加為功能並不難:
當對 有
UNIQUE
約束時,也可以保證(a)
任意(a, b, c, ..., z)
或組合。(b,c, ...a, ...z)``UNIQUE
或概括:
當 有
UNIQUE
約束 時,也 可以 保證(a1, a2, ..., aN)
任何組合 或 任何 重新 排列.(a1, a2, ..., aN, b1, b2, ..., bM)``UNIQUE
似乎它沒有被要求或它沒有被認為是足夠高的優先級來實施。
您始終可以在相應的頻道中提出請求,以實現該功能。如果 DBMS 是開源的,比如 Postgres,甚至可以自己實現它。