gpt4 book ai didi

mysql - 为什么我在单个自引用表的事务中遇到 MySQL 外键插入约束违规?

转载 作者:行者123 更新时间:2023-11-30 01:16:38 25 4
gpt4 key购买 nike

我有一个自引用表,例如:

The table schema for "ClassGroup" is:
Id String, Primary key
Name String,
ParentClassGroup String, Foreign key (refers to the "id" in this table itself)

以下事务将按预期成功:

SET AUTOCOMMIT=0;
start TRANSACTION;
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id1","cg1", null);
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id2","cg2", "id1");
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id3","cg3", null);
commit;

但是以下事务将会失败:

SET AUTOCOMMIT=0;
start TRANSACTION;
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id2","cg2", "id1");
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id1","cg1", null);
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id3","cg3", null);
commit;

错误日志:

0 08:14:29 INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id,x_talend_timestamp) values("id2","cg2", "id1", 123) Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (hier_master.classgroup, CONSTRAINT FKC0C64078BC2ACBF FOREIGN KEY (x_parentclassgroup_x_id) REFERENCES classgroup (x_id))

我的问题是:MySQL服务器不够聪明,不知道第二次插入应该在第一次插入之前完成,因为“id2”的记录引用了“id1”的记录?失败是否是由于插入顺序错误造成的?那么Oracle等其他数据库中的事务呢?
非常感谢您的见解和帮助!

最佳答案

这是预期的。在我测试的所有 RDBMS(Oracle、MySQL、H2)中,没有 RDBM 会根据数据依赖性对事务中的 sql 语句重新排序,rdbms 将按照用户在事务中输入的顺序执行每个 sql 语句。因此,您有责任确保通过在事务中正确排序 sql 插入语句来解决数据依赖性。

关于mysql - 为什么我在单个自引用表的事务中遇到 MySQL 外键插入约束违规?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18994843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com