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笔记--基于主键的单(双)向的一对一映射关系