如何在SQL表中对active=true的记录实施user_id与name的唯一性约束?
实现条件唯一约束的方案
完全可以实现你要的效果,用PostgreSQL的部分唯一索引就能满足需求,具体操作步骤如下:
1. 删除原有全局唯一约束
首先需要移除当前表中针对user_id和name的全局唯一约束,因为它限制了所有状态下的同名记录:
-- 先通过 \d workout_routine 查看约束的具体名称,替换下面的约束名 ALTER TABLE workout_routine DROP CONSTRAINT workout_routine_user_id_name_key;
2. 创建部分唯一索引
创建一个仅在active = true时生效的唯一索引,这样就能保证同一用户的活跃训练计划不会重名,而非活跃的则不受限制:
CREATE UNIQUE INDEX idx_unique_active_workout ON workout_routine (user_id, name) WHERE active = true;
效果说明
- 当插入或更新记录时,如果
active为true,数据库会检查该用户是否已有同名的活跃训练计划,存在则报错 - 当
active为false时,同一用户可以创建任意多条同名的非活跃训练计划,不会触发唯一约束
内容的提问来源于stack exchange,提问作者bugsyb
相关产品推荐
相关产品推荐

