如何解决MySQL 特定的唯一约束仅针对特定值
id、field_a、field_b、状态 我对 (field_a,field_b,status) 有唯一约束
我使用状态(映射为整数)来管理软删除,因此,当我需要将项目标记为 DELETD 时,我将更新相应值的状态。
通过这种方式,我将能够创建一个具有相同 field_a、field_b 值但具有不同状态的新行。 但是在这个逻辑中存在一个问题:如果我删除一个已经被删除的项目,我将有一个约束唯一性冲突。
例如:
- INSERT ("Element A" "XXX") -> 我将有:1,Element A,XXX,1 Status OK;
- 删除 1 -> 我将拥有:1,元素 A,XXX,1 个状态已删除;
- INSERT ("Element A" "XXX") -> 我将有:2,1 Status OK;
- DELETE ("Element A" "XXX") -> 因为违反了唯一约束(Element A,1 Status DELETED already existing),我会出错;
是否可以有相同的约束,但关于状态,我只想使用一个特定的值(在这种情况下只可以)?
解决方法
当一行的唯一索引表达式的任何组件等于 NULL 时,该行被视为唯一的 anycase(因为一个 NULL 不等于另一个 NULL)。所以:
Variant 1. 对 status
列值使用 NULL 作为该行被删除的标记。
变体 2. 在索引表达式中使用将 DELETED 状态转换为 NULL 的表达式(如果您的服务器版本允许按表达式索引):
CREATE UNIQUE INDEX idx
ON tablename (field_a,field_b,(CASE WHEN status = 'DELETED' THEN NULL ELSE status END))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。