SQL约束使2列不相等

时间:2014-04-17 10:26:24

标签: mysql sql constraints multiple-columns

我有一个表有两列来存储来自另一个表的id。 Column1从ABC表获取id,Column2也从该表中获取id,但是字母被称为父ID,因此使用此信息我知道谁是谁的父亲。

现在我想创建一个约束,不要让两列都获得相同的id。 以下不起作用:

ALTER TABLE id_parent_table
ADD CHECK (parent_id != main_id)

这仍然允许插入两个相同的数字。

2 个答案:

答案 0 :(得分:2)

现在从MySQL 8.0.16开始支持。

请参见https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html

mysql> create table id_parent_table (
    -> main_id bigint unsigned not null,
    -> parent_id bigint unsigned not null,
    -> constraint columns_cannot_equal check (main_id <> parent_id)
    -> );
Query OK, 0 rows affected (0.38 sec)

mysql> insert into id_parent_table (main_id, parent_id) values (1, 1);
ERROR 3819 (HY000): Check constraint 'columns_cannot_equal' is violated.

答案 1 :(得分:0)

显然,MySQL不支持检查约束。引用online reference

  

CHECK子句被解析但被所有存储引擎忽略。

您也可以使用触发器来阻止此类插入或更新:

编辑:MySQL不支持两个事件的单个触发器,因此您必须有两个不同的触发器:

delimiter //
CREATE TRIGGER id_parent_table_check_insert_trg
BEFORE INSERT ON id_parent_table
FOR EACH ROW
BEGIN
    DECLARE msg varchar(255);
    IF new.parent_id = new.main_id THEN
        SET msg = 'parent_id and main_id should be different';
        SIGNAL SQLSTATE '45000' SET message_text = msg;
    END IF;
END
//

CREATE TRIGGER id_parent_table_check_update_trg
BEFORE UPDATE ON id_parent_table
FOR EACH ROW
BEGIN
    DECLARE msg varchar(255);
    IF new.parent_id = new.main_id THEN
        SET msg = 'parent_id and main_id should be different';
        SIGNAL SQLSTATE '45000' SET message_text = msg;
    END IF;
END
//