mysql 使2列互不相等的SQL约束

x6h2sr28  于 2022-12-26  发布在  Mysql
关注(0)|答案(2)|浏览(191)

我有一个表,它有两列来存储来自另一个表的id。列1从ABC表中获取id,列2也从该表中获取id,但字母被称为父ID,因此通过此信息,我知道谁是谁的父。
现在,我想创建一个约束,使两列永远不会获得相同的id。以下命令不起作用:

ALTER TABLE id_parent_table
ADD CHECK (parent_id != main_id)

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

w8biq8rn

w8biq8rn1#

现在从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.
yyyllmsg

yyyllmsg2#

显然,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
//

相关问题