mysql 如何确保SQL记录的列不引用自己的主键?

k3bvogb1  于 2023-06-04  发布在  Mysql
关注(0)|答案(1)|浏览(167)

我有一个Node表,其中有一个ParentID列,该列引用其父级NodeID。我想确保没有节点可以引用自己(即一个节点的ParentID不能拥有自己的NodeID),所以我尝试添加一个检查约束CHECK(NodeID != ParentID)
但是,我得到了这个错误:Error Code: 3818. Check constraint 'node_chk_1' cannot refer to an auto-increment column.
我也不能添加ParentID作为Node的外键。
使用MySQL,我如何确保没有新记录,其中NodeID = ParentID

kiayqfof

kiayqfof1#

使用触发器:

mysql> create table node ( 
  id int auto_increment primary key, 
  parentid int, 
  foreign key (parentid) references node (id)
);

mysql> delimiter ;;

mysql> create trigger no_self_ref after insert on node for each row begin
if NEW.parentid = NEW.id then
  signal sqlstate '45000' message_text = 'no self-referencing hierarchies';
end if;
end;;

mysql> delimiter ;

请注意,它必须是AFTER触发器,因为BEFORE触发器中尚未生成自动递增id。
演示:

mysql> insert into node values (1, null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into node values (2, 2);
ERROR 1644 (45000): no self-referencing hierarchies

mysql> insert into node values (2, 1);
Query OK, 1 row affected (0.01 sec)

如果您希望防止用户更新行并将parentid设置为与同一行中的id相同的值,则还需要一个类似的AFTER UPDATE触发器。
另一种解决方案是使主键不自动递增。您必须在INSERT语句中指定每个id值,而不是让它们自动递增。但这将允许您使用CHECK约束。

相关问题