1

我正在尝试在 MySQL 中定义一个唯一约束,它将 NULL 视为彼此不明确的。


如果我有这样的表:

column1 int(11) NOT NULL,
column2 int(11) DEFAULT NULL

其值由 AUTO INCREMENT INT 填充,然后定义唯一约束,如下所示:

UNIQUE KEY uniq1 (column1, column2),

我可以插入 (1, NULL) 多次,因为 MySQL 的行为在唯一约束中将 NULL 视为彼此不同。但是,如果我真的想防止这种重复插入,除了分配一个神奇的值之外还有其他方法吗?

4

1 回答 1

3

CREATE INDEX语法中所述:

对于所有引擎,UNIQUE索引允许NULL包含多个值的列NULL

您不能在表达式上定义索引(例如在您的问题中给出),因此 MySQL 的UNIQUE索引无法按照您的意愿强制执行约束。

相反,如果匹配记录已经存在,您可以创建一个BEFORE INSERT 引发错误的触发器:

DELIMITER ;;

CREATE TRIGGER uniq1 BEFORE INSERT ON my_table FOR EACH ROW
  IF EXISTS(
    SELECT *
    FROM   my_table
    WHERE  column1 <=> NEW.column1 AND column2 <=> NEW.column2
    LIMIT  1
  ) THEN
    SIGNAL
      SQLSTATE '23000'
      SET MESSAGE_TEXT = 'Duplicate entry for key uniq1';
  END IF;;

为了防止UPDATEs 引起类似的问题,您可能还想创建一个类似的BEFORE UPDATE触发器。

于 2013-07-16T16:14:01.507 回答