我正试图在MySQL中定义一个唯一的约束,该约束将把NULL视为彼此不同。
即
如果我有这样的桌子:
column1 int(11) NOT NULL,
column2 int(11) DEFAULT NULL
其值由AUTO INCREMENT INT填充,然后定义一个唯一约束,如下所示:
UNIQUE KEY uniq1 (column1, column2),
我可以多次插入(1,NULL),因为MySQL的行为将NULL视为唯一约束中的不同NULL。然而,如果我真的想防止这种重复插入,除了分配一个神奇的值之外,还有其他方法吗?
如CREATE INDEX
语法下所述:
对于所有引擎,对于可以包含
NULL
的列,UNIQUE
索引允许多个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;;
为了防止UPDATE
引发类似的问题,您可能还需要创建一个类似的BEFORE UPDATE
触发器。