假设我有一张这样的表:
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。
答案 0 :(得分:1)
这在MySQL中根本不可能,我很害怕。
我来了#34;关闭"通过具有可空的唯一约束列(替换active
和code
字段)来解决此问题。当NULL
- 它"非活动"时,除NULL
以外的任何内容时 - 它必须是唯一的。
但这并没有准确地解决你所问的问题。 (如果您可以更新您的问题以包含更大的图片,也许可以提出更好的建议?)
否则通过存储过程读取/写入表格,或者 - 正如您自己建议的那样 - 使用触发器做一些不优雅的事情。
答案 1 :(得分:1)
要解决您的问题,您需要使用CHECK
子句,但MySQL不支持它。来自doc:
CHECK子句被解析但被所有存储引擎忽略。请参见第13.1.18节“CREATE TABLE语法”。接受但忽略语法子句的原因是兼容性,以便更容易从其他SQL服务器移植代码,以及运行创建带引用的表的应用程序。
因此,您只能通过检查应用程序级别的数据或通过存储过程在此表中插入/更新行来执行此操作。
答案 2 :(得分:0)
对不起,这并不能直接回答你的问题,但是:
也许你最好选择不同的桌面设计?您的RDBMS不支持您想要做的事情,这一直是您使用错误的有力证据。
您是否考虑过创建dept和dept_history表,dept只包含活动记录?这将解决您使用唯一约束的问题。