MySQL基于列值的唯一约束

标签 mysql sql constraints unique-constraint mysql-5.7

假设我有一个这样的表:

CREATE TABLE dept (
  id     VARCHAR(255) NOT NULL PRIMARY KEY,
  code   VARCHAR(255) NOT NULL,
  active BIT          NOT NULL,
  ...
);

问题:

我想在 code 列上添加一个唯一约束。但它应该仅在 active 设置为 true 时应用(仅应在事件记录中检查唯一性)。可以有很多记录具有 active = false 和相同的 code 所以我不能在多个列上使用约束。

我尝试了什么:

我没有在 the documentation 中找到任何引用资料证明这种约束是可能的,但我知道在 other databases 中是可能的使用独特的基于函数的索引。

当然我可以编写一个触发器来检查每个添加/更新操作的不变量,但我希望有更有效的解决方案。

我正在使用 MySQL 5.7.15。

最佳答案

恐怕这在 MySQL 中是不可能的。

过去,我已经“接近”解决这个问题,方法是使用一个唯一约束的可为空的列(替换 activecode 字段)。当 NULL 时 - 它是“不活动的”,当 NULL 以外的任何东西时 - 它必须是唯一的。

但这并不能完全解决您提出的问题。 (如果您可以更新您的问题以包含更大的图片,也许可以建议更好的东西?)

否则通过存储过程读取/写入表,或者 - 正如您自己建议的那样 - 使用触发器做一些不雅的事情。

关于MySQL基于列值的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550176/

相关文章:

php - 使用 codeigniter 在数据库中插入多个复选框值

php - Laravel 无法删除或更新父行 : a foreign key constraint fails

sql - 甲骨文11g : Using cursors inside a procedure

sql-server - 添加具有生成名称的 DEFAULT 约束

elasticsearch - 如何检查Elasticsearch唯一文件

database - 使用交易表在表的字段中执行计算

c# - (当用户输入数据时mySQL行锁c#

php - 如何解决php中的撇号问题

java - Java 中的 SQL 转义和批量插入

sql - 如何在 SQL Server 上执行大型 SQL 文件?