假设我有一个这样的表:
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 中是不可能的。
过去,我已经“接近”解决这个问题,方法是使用一个唯一约束的可为空的列(替换 active
和 code
字段)。当 NULL
时 - 它是“不活动的”,当 NULL
以外的任何东西时 - 它必须是唯一的。
但这并不能完全解决您提出的问题。 (如果您可以更新您的问题以包含更大的图片,也许可以建议更好的东西?)
否则通过存储过程读取/写入表,或者 - 正如您自己建议的那样 - 使用触发器做一些不雅的事情。
关于MySQL基于列值的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550176/