作者
digoal
日期
2021-02-09
标签
PostgreSQL , 排他 , excluding , GiST
背景
A组和B组结伴了, 就不能再和其他组结伴.
每个组内有成员ID, 每个成员ID对应一条记录. 同时将组ID列入字段中.
约束: A组和B组结伴了, 就不能再和其他组结伴.
```
create extension btree_gist;
create table t_ins (
id1 int, -- 结伴ID1
id2 int, -- 结伴ID2
x text,
exclude using gist (id1 with =, id2 with <>)
);
insert into t_ins values (1,1,random()::Text);
insert into t_ins values (1,1,random()::Text);
insert into t_ins values (1,2,random()::Text);
insert into t_ins values (3,2,random()::Text);
ERROR: 23P01: conflicting key value violates exclusion constraint "t_ins_id1_id2_excl"
DETAIL: Key (id1, id2)=(1, 2) conflicts with existing key (id1, id2)=(1, 1).
SCHEMA NAME: public
TABLE NAME: t_ins
CONSTRAINT NAME: t_ins_id1_id2_excl
LOCATION: check_exclusion_or_unique_constraint, execIndexing.c:839
insert into t_ins values (3,2,random()::Text);
insert into t_ins values (3,2,random()::Text);
```
文档
https://www.postgresql.org/docs/13/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
202102/20210208_03.md 《用 PostgreSQL 的排他约束实现 - 行政区不可跨界 约束, 会议室预定时间不交叉 约束 等.》
201911/20191128_01.md 《PostgreSQL 约束延判(unique, primary key, foreign key, exclude) - deferrable》
201905/20190527_01.md 《PostgreSQL exclude 约束之 - 绑定一对一的关系》
201712/20171223_02.md 《会议室预定系统实践(解放开发) - PostgreSQL tsrange(时间范围类型) + 排他约束》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.