PostgreSQL办公工位预订系统特定状态多列唯一约束实现
PostgreSQL 工位预订表的条件唯一约束实现
你有一张用于办公工位预订系统的PostgreSQL表,表结构及示例数据如下:
| ID | Booked_Date | Seat_ID | Employee_ID | Status |
|---|---|---|---|---|
| 1 | 2022-07-08 | 10C | id1 | booked |
| 2 | 2022-07-08 | 20C | id2 | cancelled |
需求是:确保同一日期、同一工位最多只能被一位员工预订(即status为booked的记录),同时允许保留取消预订的记录(status改为cancelled)。
解决方案:使用部分唯一索引
普通的多列唯一约束无法针对特定状态生效,PostgreSQL提供的**部分唯一索引(Partial Unique Index)**正好能解决这个问题,它只对满足指定条件的行施加唯一约束。
执行以下SQL语句创建索引(记得替换your_table_name为你的实际表名):
CREATE UNIQUE INDEX idx_unique_booked_seat ON your_table_name (booked_date, seat_id) WHERE status = 'booked';
效果说明
- 当尝试插入或更新出**同一
booked_date、同一seat_id且status为booked**的第二条记录时,PostgreSQL会抛出唯一约束冲突错误,阻止操作。 - 状态为
cancelled的记录不受此约束,同一日期和工位下可以存在多条取消记录,也可以和已预订的记录共存。 - 当某条预订记录被修改为
cancelled后,该日期和工位可以再次被预订(插入新的booked状态记录)。
内容的提问来源于stack exchange,提问作者Akhmad Zaki
相关产品推荐
相关产品推荐

