Postgresql
僅當 Y 值相同時才允許多行具有相同的 X 值?
給定一個(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
.