基于列值

时间:2017-11-29 10:12:20

标签: 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 = falsecode的记录可能很多,所以我不能在多列上使用约束。

我尝试了什么:

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

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

我正在使用MySQL 5.7.15。

3 个答案:

答案 0 :(得分:1)

这在MySQL中根本不可能,我很害怕。

我来了#34;关闭"通过具有可空的唯一约束列(替换activecode字段)来解决此问题。当NULL - 它"非活动"时,除NULL以外的任何内容时 - 它必须是唯一的。

但这并没有准确地解决你所问的问题。 (如果您可以更新您的问题以包含更大的图片,也许可以提出更好的建议?)

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

答案 1 :(得分:1)

要解决您的问题,您需要使用CHECK子句,但MySQL不支持它。来自doc:

  

CHECK子句被解析但被所有存储引擎忽略。请参见第13.1.18节“CREATE TABLE语法”。接受但忽略语法子句的原因是兼容性,以便更容易从其他SQL服务器移植代码,以及运行创建带引用的表的应用程序。

因此,您只能通过检查应用程序级别的数据或通过存储过程在此表中插入/更新行来执行此操作。

答案 2 :(得分:0)

对不起,这并不能直接回答你的问题,但是:

也许你最好选择不同的桌面设计?您的RDBMS不支持您想要做的事情,这一直是您使用错误的有力证据。

您是否考虑过创建dept和dept_history表,dept只包含活动记录?这将解决您使用唯一约束的问题。