微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL 特定的唯一约束仅针对特定值

如何解决MySQL 特定的唯一约束仅针对特定值

我有一个包含这些字段的表格:

id、field_a、field_b、状态 我对 (field_a,field_b,status) 有唯一约束

我使用状态(映射为整数)来管理软删除,因此,当我需要将项目标记为 DELETD 时,我将更新相应值的状态。

通过这种方式,我将能够创建一个具有相同 field_a、field_b 值但具有不同状态的新行。 但是在这个逻辑中存在一个问题:如果我删除一个已经被删除的项目,我将有一个约束唯一性冲突。

例如:

  1. INSERT ("Element A" "XXX") -> 我将有:1,Element A,XXX,1 Status OK;
  2. 删除 1 -> 我将拥有:1,元素 A,XXX,1 个状态已删除
  3. INSERT ("Element A" "XXX") -> 我将有:2,1 Status OK;
  4. DELETE ("Element A" "XXX") -> 因为违反了唯一约束(Element A,1 Status DELETED already existing),我会出错;

是否可以有相同的约束,但关于状态,我只想使用一个特定的值(在这种情况下只可以)?

解决方法

当一行的唯一索引表达式的任何组件等于 NULL 时,该行被视为唯一的 anycase(因为一个 NULL 不等于另一个 NULL)。所以:

Variant 1.status 列值使用 NULL 作为该行被删除的标记。

fiddle for variant 1

变体 2. 在索引表达式中使用将 DELETED 状态转换为 NULL 的表达式(如果您的服务器版本允许按表达式索引):

CREATE UNIQUE INDEX idx
ON tablename (field_a,field_b,(CASE WHEN status = 'DELETED' THEN NULL ELSE status END))

fiddle for variant 2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。