簡體   English   中英

如何在postgres的多個表中定義多個列的唯一約束?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM