0

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

“ClassGroup”的表模式是:
Id String,主键
Name String,
ParentClassGroup String,外键(指的是这个表本身的“id”)

以下事务将按预期成功:

设置自动提交=0;
开始交易;
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id1”,“cg1”,null);
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id2”,“cg2”,“id1”);
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id3”,“cg3”,null);
犯罪;

但以下事务将失败:

设置自动提交=0;
开始交易;
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id2”,“cg2”,“id1”);
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id1”,“cg1”,null);
插入类组(x_id,x_name,x_parentclassgroup_x_id)值(“id3”,“cg3”,null);
犯罪;

错误日志:

0 08:14:29 INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id,x_talend_timestamp) values("id2","cg2", "id1", 123) 错误代码:1452。无法添加或更新子行:外键约束失败(hier_master.classgroup,CONSTRAINT FKC0C64078BC2ACBF FOREIGN KEY (x_parentclassgroup_x_id) REFERENCES classgroup (x_id))

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

4

2 回答 2

0

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

于 2013-12-08T04:22:44.217 回答
0

在 MySQL 中有一个称为延迟约束检查的规定。

它所做的是,它执行用户对表执行的所有操作,然后检查约束违规,而不是在每个插入语句之后检查约束违规的正常方式。

我不知道延迟约束检查的确切语法,但我相信您可以通过 Internet 轻松找到它。我希望这有帮助!:)

于 2015-02-15T17:55:54.150 回答