Sql 如何在postgres中定义多个表中多个列的唯一约束?

Sql 如何在postgres中定义多个表中多个列的唯一约束?,sql,postgresql,Sql,Postgresql,我有一些表格,为了简单起见,假设2个: CREATE TABLE A ( name varchar ... ); CREATE TABLE B ( name varchar ... ); 这些表有不同的结构,但都有相同的列(name) 我想在所有这些表中的所有列上添加一个唯一的约束 我该怎么做?这看起来很简单,但我的谷歌搜索到目前为止还没有成功。大多数现有问题似乎涉及同一个表中的多个列。由于唯一约束不能跨越多个表,因此需要创建一个额外的表来存储所有名称。然后,每

我有一些表格,为了简单起见,假设2个:

CREATE TABLE A (
    name varchar
    ...
);
CREATE TABLE B (
    name varchar
    ...
);
这些表有不同的结构,但都有相同的列(
name

我想在所有这些表中的所有列上添加一个唯一的约束


我该怎么做?这看起来很简单,但我的谷歌搜索到目前为止还没有成功。大多数现有问题似乎涉及同一个表中的多个列。

由于
唯一约束不能跨越多个表,因此需要创建一个额外的表来存储所有名称。然后,每个表都会有一个外键来对应额外的表

例如:

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!
请注意,现在每个插入都需要在extra
all_names
表中进行额外插入。但是,这可以通过使用插入前/插入后触发器(未显示)实现自动化(并在幕后发生)

请参阅上的运行示例

如果实现触发器,则插入看起来很简单,如下所示:

insert into a (name) values ('Jenny'); -- succeeds
insert into b (name) values ('Ivan'); -- succeeds
insert into b (name) values ('Jenny'); -- fails!

那么,是否希望表a中插入的名称不能插入表B(或C或D等)?没错,所有这些表中所有列中的值都应该是唯一的。好问题+1。这也可以被视为PostgreSQL继承,其中
name
属性属于抽象实体,并且在那里是唯一的。