Postgres跨两列的唯一约束?

时间:2018-02-08 19:22:00

标签: sql postgresql unique-constraint unique-index

这是我当前的数据库结构:

Col1   Col2
 1    abc123
 1    abc123
 1    def321
 2    xyz789
 2    xyz789

我希望确保Col2中的任何条目仅用于Col1中的相同条目。例如,数据库允许您添加此行:

Col1   Col2
 2    lmn456

但不是这一个:

Col1   Col2
 2    abc123

有没有办法用唯一索引强制执行此操作?通常,唯一性强制特定组合对于整个表格是唯一的(即(1,abc123)只显示不超过一次)。

我无法将Col2移到另一个表并使用联接,因为我需要为Col2中的每个条目支持Col1的多个值 - 它'不是1对1。

2 个答案:

答案 0 :(得分:4)

没有。您的数据结构错误。

您应该将col2存储在每个col1col2一行的单独表格中。然后,您可以使用join来查找值。

答案 1 :(得分:1)

这是使用exclude constraint.

的典型案例

约束将使用btree运算符<>=,因此您必须安装btree_gist extension.

create extension if not exists btree_gist;

create table my_table(
    col1 int, 
    col2 text,
    exclude using gist (col1 with <>, col2 with =)
);

测试:

insert into my_table values
    (1, 'abc123'),
    (1, 'abc123'),
    (1, 'def321'),
    (2, 'xyz789'),
    (2, 'xyz789')
returning *;

 col1 |  col2  
------+--------
    1 | abc123
    1 | abc123
    1 | def321
    2 | xyz789
    2 | xyz789
(5 rows)    

insert into my_table 
values (2, 'abc123');

ERROR:  conflicting key value violates exclusion constraint "my_table_col1_col2_excl"
DETAIL:  Key (col1, col2)=(2, abc123) conflicts with existing key (col1, col2)=(1, abc123).