Liquibase添加非空值唯一约束报错,寻求解决方案
解决仅为非空值添加唯一约束的问题
标准SQL的ALTER TABLE ... ADD CONSTRAINT UNIQUE语法不支持WHERE子句,这就是你遇到语法错误的原因。要实现仅对非空值的唯一约束,需根据使用的数据库类型选择对应方法:
SQL Server:创建带筛选条件的唯一索引
CREATE UNIQUE NONCLUSTERED INDEX uc_banana_member ON apple_member (banana_id, apple_id) WHERE banana_id IS NOT NULL;该索引仅对
banana_id非空的行强制唯一约束,空值行不受约束限制。PostgreSQL:创建部分唯一索引
CREATE UNIQUE INDEX uc_banana_member ON apple_member (banana_id, apple_id) WHERE banana_id IS NOT NULL;PostgreSQL的部分索引通过
WHERE子句指定约束生效的行范围,完全匹配你的需求。MySQL:利用NULL特性或函数索引
- 若仅需允许
banana_id为NULL的行重复,直接创建普通唯一约束即可:
MySQL的唯一约束中,只要存在NULL值就不会触发唯一检查,自然满足非空ALTER TABLE apple_member ADD CONSTRAINT uc_banana_member UNIQUE (banana_id, apple_id);banana_id行的唯一要求。 - MySQL 8.0.13及以上版本支持函数索引,可更精准控制:
CREATE UNIQUE INDEX uc_banana_member ON apple_member (CASE WHEN banana_id IS NOT NULL THEN banana_id END, apple_id);
- 若仅需允许
内容的提问来源于stack exchange,提问作者Alper Arslan
相关产品推荐
相关产品推荐

