MySQL双向关系和镜像外键的问题

Posted

技术标签:

【中文标题】MySQL双向关系和镜像外键的问题【英文标题】:Problems with MySQL bidirectional relationship and mirrored foreign keys 【发布时间】:2012-09-12 11:12:21 【问题描述】:

我必须创建两个具有双向关系的表,如下图所示。 但它总是给出一个错误。我正在使用以下查询来创建表。

CREATE TABLE IF NOT EXISTS `rpt_operation` (
  `op_id` int(45) NOT NULL,
  `component` int(45) NOT NULL,
  `ideal_time` time NOT NULL,
  `handling_time` time NOT NULL,
  PRIMARY KEY (`op_id`),

  INDEX (component),
  FOREIGN KEY (component)
  REFERENCES rpt_component(comp_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



CREATE TABLE IF NOT EXISTS `rpt_component` (
  `comp_id` int(45) NOT NULL,
  `lot_code` int(60) NOT NULL,
  `lot_color` varchar(60) NOT NULL,
  `drawing_num` int(60) NOT NULL,
  `revision_num` int(60) NOT NULL,
  `operation` int(45) NOT NULL,
  PRIMARY KEY (`comp_id`),

  INDEX (operation),
  FOREIGN KEY (operation)
  REFERENCES rpt_operation(op_id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

错误出现在rpt_operation 表的component int(45) NOT NULL 行。 任何帮助将不胜感激。 提前致谢

【问题讨论】:

首先,这很可能是由于命令的顺序,您可以先创建两个表,然后在它们上设置索引。无论如何,“双向”关系有时是一个更好的提示,但两个表都放入一个更大的表中(在 rpt_operation 中不能有一行,而 rpt_component 中没有一行),因为这样做我看不到规范化的中断。 【参考方案1】:

您的表结构是不可能的。不能在rpt_operation 中插入任何记录,因为rpt_component 中没有针对component 外键的记录,也不能在rpt_component 中插入任何记录,因为rpt_operation 中没有针对operation 外键。

如果您将这些字段中的一个或两个都设为空,则表结构仍然是递归的,因此您必须手动添加其中一个外键,例如:

ALTER TABLE rpt_operation
  ADD CONSTRAINT
  FOREIGN KEY (component)
  REFERENCES rpt_component(comp_id);

【讨论】:

循环依赖可以在其他 DBMS 中通过使用延迟约束来解决。【参考方案2】:

我建议您使用链接表来解决此问题。这不是一个可行的解决方案,需要变通方法。

【讨论】:

以上是关于MySQL双向关系和镜像外键的问题的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 之 关联映射的基于外键的双向一对一关联

hibernate基础08:关联映射之基于外键的双向一对一

hibernate 一对多双向关联 外键值为空 怎么结决?

hibernate笔记--基于主键的单(双)向的一对一映射关系

Hibernate学习———— hibernate一对一关系映射详解

hibernate关联映射