6

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

4

3 回答 3

3

根据文档

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

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

于 2013-03-08T17:44:10.083 回答
0

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

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

我不会讨论这样一个事实,即这不会容易引起混淆,或者你是否“应该”甚至做这样的事情。

您可以通过在 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
于 2013-03-08T19:27:22.993 回答
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

然后检查是否有任何匹配,最后如果不匹配,运行您的插入语句。如果您正在做这个自由职业者,也许另一列只是一个布尔值,如果为真,那么 MY_COLUMN = 'xyz' 否则查看 MY_COLUMN 并获得 val。这是一个棘手的问题。

于 2013-03-08T17:48:45.457 回答