Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查MySQL中两列的唯一约束_Mysql_Sql_Unique Constraint - Fatal编程技术网

检查MySQL中两列的唯一约束

检查MySQL中两列的唯一约束,mysql,sql,unique-constraint,Mysql,Sql,Unique Constraint,我想在MySQL表上添加一个unicity约束。此表包含四列: ID | NAME | ADDRESS1 | ADDRESS2 此约束必须检查,对于新行,新的address1和address2既不包含在address1中,也不包含在address2中 例如: INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('A', 'B'); -- OK INSERT INTO MYTABLE (ADDRESS1, ADDRESS2) values ('C',

我想在MySQL表上添加一个unicity约束。此表包含四列:

ID | NAME | ADDRESS1 | ADDRESS2
此约束必须检查,对于新行,新的
address1
address2
既不包含在
address1
中,也不包含在
address2

例如:

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

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

您可以在以这种方式触发之前使用

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版本缺少
信号
,因此在找到具有相同地址的行时,技巧是违反其中一列的
非空
约束


这里是演示。取消对最后一条insert语句的注释,然后单击
buildschema
。这些插入不会成功。

您的设计不适合地址(使用单独的表)无论如何,您可以使用唯一的标记。我知道设计可能会更好。但不幸的是,我不能改变它,这就是为什么我要寻找这样一个约束。你总是可以创建一个触发器。我不相信MySQL有检查约束,这在这里是很理想的。是的,实际上检查约束存在,但被忽略了。@dounyy哈哈-检查存在,但什么都不做?好吧,这是一个适合我需要的解决方案,唯一的一点是违反
notnull
约束会返回一条不太合适的错误消息。我将寻找一种方法来定义一个定制的,我最终决定在我的Java代码中管理这个单一性。这对我来说更容易,而且在我看来,这比使用变通方法/黑客来替换我的MySQL版本不支持的功能要好。然而,我接受你的回答,因为它本可以帮助我,也可能会帮助其他人。多谢各位。