如何为PostgreSQL社区事件表添加带例外规则的GIST排他约束?
修改PostgreSQL排他约束实现社区事件规则
直接修改原有排他约束的WHERE条件,加入对community_id=1的排除逻辑即可满足需求:
CREATE TABLE community_event ( community_id integer, event_start timestamptz, event_end timestamptz, canceled boolean DEFAULT false, EXCLUDE USING gist ( community_id WITH =, tstzrange(event_start, event_end) WITH && ) WHERE (not canceled AND community_id != 1) );
逻辑说明
- 原有约束会限制所有社区的未取消事件不能在同一社区内时间重叠
- 修改后的
WHERE (not canceled AND community_id != 1)让约束仅作用于:- 未取消的事件(
not canceled) - 非admin社区(
community_id != 1)
- 未取消的事件(
- 这样
community_id=1的admin社区就不受该约束限制,可创建任意多重叠的未取消事件,其他社区则保持同一时间仅能存在一个未取消事件的规则
如果是对已存在的表修改约束,可以用以下ALTER TABLE语句:
ALTER TABLE community_event DROP CONSTRAINT IF EXISTS community_event_community_id_tstzrange_excl; -- 替换为实际约束名 ALTER TABLE community_event ADD CONSTRAINT community_event_community_id_tstzrange_excl EXCLUDE USING gist ( community_id WITH =, tstzrange(event_start, event_end) WITH && ) WHERE (not canceled AND community_id != 1);
内容的提问来源于stack exchange,提问作者kewur
相关产品推荐
相关产品推荐

