我有一个表有两列来存储来自另一个表的id。 Column1从ABC表获取id,Column2也从该表中获取id,但是字母被称为父ID,因此使用此信息我知道谁是谁的父亲。
现在我想创建一个约束,不要让两列都获得相同的id。 以下不起作用:
ALTER TABLE id_parent_table
ADD CHECK (parent_id != main_id)
这仍然允许插入两个相同的数字。
答案 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
//