我想在我的MySQL表上添加一个唯一性约束。该表包含四列:

ID | NAME | ADDRESS1 | ADDRESS2


此约束必须检查对于新行,新的address1address2都没有包含在ADDRESS1ADDRESS2中。

范例:

INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('A', 'B'); -- OK
INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('C', 'D'); -- OK
INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('E', 'A'); -- Fails because A exists in ADDRESS1
INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('D', 'F'); -- Fails because D exists in ADDRESS2


有没有办法定义这样的约束?

最佳答案

您可以通过BEFORE触发器来完成此操作

CREATE TRIGGER tg_bi_mytable
BEFORE INSERT ON mytable
FOR EACH ROW
  SET NEW.address1 = IF(EXISTS
     (
       SELECT *
        FROM mytable
       WHERE address1 IN(NEW.address1, NEW.address2)
          OR address2 IN(NEW.address1, NEW.address2)
     ), NULL, NEW.address1);


注意:由于您使用的MySQL版本缺少SIGNAL,因此技巧是在找到具有相同地址的行时违反其中一列的NOT NULL约束。

这是SQLFiddle演示。取消注释最后一个插入语句之一,然后单击Build Schema。这些插入不会成功。

10-05 23:43