PostgreSQL中如何用add constraint创建含case的唯一约束?
表达式场景下
ADD CONSTRAINT ... UNIQUE的可用性说明 是否支持该写法完全取决于你使用的数据库,主流数据库的适配情况如下:
- PostgreSQL 原生支持在唯一约束中直接内联
CASE等表达式,不需要额外处理,语法示例:
执行后会自动生成对应的表达式唯一索引,约束效果、性能和直接使用ALTER TABLE target_table ADD CONSTRAINT unique_case_rule UNIQUE (id, (CASE WHEN status = 'active' THEN user_id ELSE NULL END));CREATE UNIQUE INDEX完全一致,可以正常纳入你的统一写法规范。 - MySQL、SQL Server 不支持直接在唯一约束中写内联表达式,如果你要实现相同的约束逻辑,必须先新建一个持久化的生成列/计算列,把
CASE逻辑定义在列层面,再对该列添加唯一约束:
这种场景下无法直接通过一行-- MySQL示例 ALTER TABLE target_table ADD COLUMN active_user_id INT GENERATED ALWAYS AS (CASE WHEN status = 'active' THEN user_id ELSE NULL END) STORED; ALTER TABLE target_table ADD CONSTRAINT unique_case_rule UNIQUE (id, active_user_id);ADD CONSTRAINT语句完成表达式唯一约束的创建,你可以根据团队规范选择是用这种两步写法,还是例外直接使用CREATE UNIQUE INDEX创建表达式索引。
补充:部分文章推荐优先用ADD CONSTRAINT写法的核心原因是可以显式指定约束名,后续维护、修改约束时更容易定位,只要数据库支持的场景下二者的底层实现没有本质差异。
内容的提问来源于stack exchange,提问作者OblivionBun
相关产品推荐
相关产品推荐

