【问题标题】:how to perform one-to-one relational insertion in database如何在数据库中执行一对一的关系插入
【发布时间】:2011-10-11 14:56:45
【问题描述】:

我正在使用 Mysql。而且我有两张彼此一一相关的表。

换句话说,它们都具有引用另一个表的主键的外键约束。

如果我尝试为每个表插入一条记录,其中每条记录引用另一条记录。 喜欢:

Mysql 数据库会阻止这样的操作,因为一对一的外键约束。

这就像鸡蛋问题。

但是,我注意到在 Java hibernate 中,如果两个实体类是一对一相关的,则可以进行这样的操作。

如何在 Hibernate 中做到这一点,因为我注意到两个插入(来自 Hibernate 调试消息)就像我所做的那样是分开的。所以没有什么特别的。

或者如何强制插入一条记录,即使它应该引用的记录还不存在?

【问题讨论】:

  • 循环外键约束的原因是什么?这可能意味着糟糕的设计。
  • 我想我也面临着类似的问题。此问题的任何解决方案,请发布。 TIA
  • 这是一个很好的问题,让我想知道。 sudmong 下面的回答很可能是它是如何使用 ORM 框架完成的。

标签: mysql database hibernate one-to-one insertion


【解决方案1】:

为引用的列之一放置空值,引用列确实允许空值。稍后在引用的列中插入记录后,您可以更新该列。

【讨论】:

  • 实际上我注意到 hibernate 和你建议的一样,sudmong。
【解决方案2】:

您可以尝试通过在两个插入查询之前运行SET foreign_key_checks = 0 来禁用外键检查,并在您的查询之后立即通过执行SET foreign_key_checks = 1 来启用外键检查。

更多关于foreign key constraints的信息。

mysql > SET foreign_key_checks = 0;
mysql > INSERT INTO t1 (t2_id) VALUES (1);
mysql > INSERT INTO t2 (t1_id) VALUES (1);
mysql > SET foreign_key_checks = 1;

【讨论】:

  • 禁用外键约束通常是一个非常糟糕的主意。如果你这样做了,那么至少把整个地段放在一个交易中。
  • 当然你应该在事务中运行它。但是我看不到任何其他方法可以在不禁用外键检查的情况下实现所需...
  • 对不起,忽略它。我弄错了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
相关资源
最近更新 更多