这是我当前的数据库结构:
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。
答案 0 :(得分:4)
没有。您的数据结构错误。
您应该将col2
存储在每个col1
和col2
一行的单独表格中。然后,您可以使用join
来查找值。
答案 1 :(得分:1)
约束将使用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).