Postgresql

僅當 Y 值相同時才允許多行具有相同的 X 值?

  • September 16, 2022

給定一個(postgres)表,

CREATE TABLE links (
   id bigint NOT NULL,
   url text NOT NULL,
   owner_id bigint NOT NULL
);

url當且僅當它們也具有相同的owner_id.

即這將是允許的:

id | url | owner_id
----+-----+---------
 7 | foo |        1
 8 | bar |        1
 9 | bar |        1

但這不會:

id | url | owner_id
----+-----+---------
 7 | foo |        1
 8 | bar |        1
 9 | bar |        2

有沒有辦法強制執行這樣的約束?

您可以使用 EXCLUDE 約束。您將需要一個輔助擴展來獲得正確的運算符來使用。

create extension btree_gist;
alter table links add constraint lksjdf exclude using gist (url with =, owner_id with <>);

您需要規範化您的表格。顯然,url不屬於links表,它屬於owner表。

CREATE TABLE owner (
   id bigint NOT NULL PRIMARY KEY,
   url text NOT NULL
);

CREATE TABLE links (
   id bigint NOT NULL PRIMARY KEY,
   owner_id bigint NOT NULL REFERENCES owner (id)
);

現在,links不需要確保關於 的任何事情url,因為owner表格已經這樣做了,因為url每個id.

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