[英]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.