[英]How to define unique constraint on multiple columns in multiple tables in postgres?
我有一些表,為了簡單起見,我們說 2:
CREATE TABLE A (
name varchar
...
);
CREATE TABLE B (
name varchar
...
);
這些表具有不同的結構,但都具有相同的列( name
)
我想在所有這些表中的所有這些列上添加一個唯一約束。
我怎樣才能做到這一點? 這似乎是一件簡單的事情,但到目前為止我的谷歌搜索還沒有被證明是成功的。 大多數現有問題似乎都處理同一張表中的多個列。
由於UNIQUE
約束不能跨越多個表,因此您需要創建一個額外的表來存儲所有名稱。 然后每個表都會有一個針對額外表的外鍵。
例如:
create table all_names (
zone int not null,
name varchar(20) not null,
constraint uq1 unique (zone, name),
constraint uq2 unique (name) -- this is the critical constraint!
);
create table a (
zone int not null default 1 check (zone = 1),
name varchar(20) not null,
constraint fk1 foreign key (zone, name) references all_names (zone, name)
);
insert into all_names (zone, name) values (1, 'Jenny'); -- succeeds
insert into a (name) values ('Jenny'); -- succeeds
create table b (
zone int not null default 2 check (zone = 2),
name varchar(20) not null,
constraint fk2 foreign key (zone, name) references all_names (zone, name)
);
insert into all_names (zone, name) values (2, 'Ivan'); -- succeeds
insert into b (name) values ('Ivan'); -- succeeds
insert into all_names (zone, name) values (2, 'Jenny'); -- fails!
insert into b (name) values ('Jenny'); -- fails!
請注意,現在每個插入都需要在額外的all_names
表中進行額外的插入。 然而,這可以通過使用插入前/插入后觸發器(未顯示)來自動化(並在幕后發生)。
請參閱DB Fiddle上的運行示例。
如果您實現觸發器,那么您的插入將看起來很簡單,如下所示:
insert into a (name) values ('Jenny'); -- succeeds
insert into b (name) values ('Ivan'); -- succeeds
insert into b (name) values ('Jenny'); -- fails!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.