是否有可能有一个MySQL约束要求列是唯一的*除非*它等于特定值?

时间:2013-03-08 17:39:02

标签: mysql sql

假设我有一个表格,我希望MY_COLUMN的值是唯一的,除非值为'xyz'。换句话说,MY_COLUMN可能是多行中的'xyz',但所有不是'xyz'的值必须是唯一的。是否可以设置实现此目的的约束?

3 个答案:

答案 0 :(得分:3)

根据documentation

  

UNIQUE索引创建一个约束,以便索引中的所有值   必须是截然不同的如果您尝试使用a添加新行,则会发生错误   与现有行匹配的键值。对于所有引擎,都是独一无二的   index允许包含NULL的列的多个NULL值。

因此,创建一个可以为空的列,当您查询表时,只需使用ISNULL(MY_COLUMN, 'xyz')

答案 1 :(得分:0)

您无法设置约束来执行此操作,但是如果您在内部执行此操作,请说一个java项目,您可以执行类似

的操作
If (MY_COLUMN != "xyz"){
    Get records of table with "xyz" in it 
    X = //maping would equal "Select MY_COLUMN from table" (or select * from table depending on your mapping

然后检查是否有匹配,最后如果不匹配,则运行insert语句。如果你正在做这个自由职业者,也许另一个专栏只是一个bool来说如果是真的,那么MY_COLUMN ='xyz'否则看看MY_COLUMN并得到val。这是一个棘手的问题。

答案 2 :(得分:0)

考虑到这一点,我想我会提供我的意见。

正如其他答案正确指出的那样,MySQL不能有一个有重复的UNIQUE索引。

我不打算辩论这不容易引起混淆的事实,也不会甚至你应该做这样的事情。

你可以通过在my_column上使用常规索引来实现我认为相同的结果,但也将其设置为NOT NULL(这很重要,因为没有这个,触发器不会在重复索引上引发错误)。 然后,您可以按如下方式为my_table创建TRIGGER:

CREATE TRIGGER my_table_unique_index_with_exception BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
  IF NEW.my_column != 'xyz' THEN
    -- The value isn't 'xyz' so only one instance of this value is allowed
    -- check the count and if the value exists set it to NULL which will thorw 
    -- an error as my_column annot be NULL
    IF (SELECT COUNT(*) FROM my_table WHERE my_table.my_row = NEW.my_column) > 0 THEN
      SET NEW.my_column = NULL;
  END IF;
END