Postgresql

為什麼複合外鍵需要單獨的唯一約束?

  • October 26, 2016

這是一個簡單的表,其中記錄可以引用同一表中的父記錄:

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 KEYthatREFERENCES (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,甚至可以自己實現它。

引用自:https://dba.stackexchange.com/questions/153392