Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提交前的SQL外键_Java_Mysql_Sql_Transactions_Foreign Keys - Fatal编程技术网

Java 提交前的SQL外键

Java 提交前的SQL外键,java,mysql,sql,transactions,foreign-keys,Java,Mysql,Sql,Transactions,Foreign Keys,在Java的游戏服务器代码中,我将客户机数据拆分为许多表,以便于将来添加新内容 现在我有以下表格 名字 认证 存货 name表包含id和name列 auth表中有id和password列 auth和inventory表上的id列对name的id列具有外键约束 创建新客户机时,我将insert插入name表中,获取生成的id并将其他表中的其余数据插入单独的insert语句中,但全部插入到单个事务中 问题是,当我插入到auth表中时,由于在name中签入外键,它失败了,因为我还没有提交它。是否有

在Java的游戏服务器代码中,我将客户机数据拆分为许多表,以便于将来添加新内容

现在我有以下表格

  • 名字
  • 认证
  • 存货
name
表包含
id
name

auth
表中有
id
password

auth
inventory
表上的
id
列对
name
id
列具有外键约束

创建新客户机时,我将insert插入
name
表中,获取生成的id并将其他表中的其余数据插入单独的insert语句中,但全部插入到单个事务中


问题是,当我插入到
auth
表中时,由于在
name
中签入外键,它失败了,因为我还没有提交它。是否有更好的方法解决此问题而不必在每次插入时都提交?

如果仍然存在问题,作为临时解决方案,您可以暂时禁用外键检查以获得通过

SET FOREIGN_KEY_CHECKS=0;
确保在使用后重新启用

SET FOREIGN_KEY_CHECKS=1;

除非在插入父表之后
回滚
子表将允许插入与父表中新插入的行相对应的行,即使插入父表后没有
提交
因此,这几乎不是问题担心。
DML
操作的影响持续到下一次
回滚
,并通过
提交
语句变得永久。因此,如果在父表中执行
insert
操作后未显式执行
rollback
,则无论执行任何
commit
操作,子表都将始终允许与父表中所有行相对应的insert


因此,即使
外键\u CHECKS=1

,这个问题也不应该出现。我对这个问题做了一些研究,以找到解决方案。在同一事务中添加父项和子项时,外键约束引发错误,这与我遇到的问题相同

问题和解决方法不在于代码,而在于数据库。问题是可推迟的限制。下面的2个链接讨论了Oracle的这些功能。下面的2个讨论SQLServer和MySQL。我的一些研究表明MySQL会自动延迟;下面的链接说没有

从我所读到的内容来看,约束通常会立即测试并失败。通过延迟约束,它将测试完成的提交





我不能更改数据库结构以避免此问题吗?至少在标准中是这样吗?在提交之前绕过检查感觉有点不舒服,如果有一个实际的fk约束错误,我该如何处理它?不幸的是,没有,这是好的和坏的。外键检查是无情的,插入不存在外键的记录的唯一方法是不强制执行检查。是否至少有一种方法可以一次插入所有表中,以检查通过的方式进行插入?前提是在事务中不进行插入,或者至少在插入
auth
表之前进行提交。
名称
记录必须存在。在插入auth之前,不需要对name进行提交。您的事务会看到您插入的新行,因此,对于您来说,该行确实存在,并且没有违反外键约束。这听起来像是您误判了问题,或者您的代码没有执行您认为它正在执行的操作。如果不能在同一事务中插入父表和子表,那就太荒谬了。。。这是一种事务点,将数据库更改分组到一个原子工作单元中,不管是全部还是全部。