无法添加或更新子行:外键约束。这是不可能的

时间:2014-10-29 11:06:49

标签: mysql foreign-keys

我面临一个非常奇怪的MySQL问题,我在添加新行时遇到以下错误:

  

无法添加或更新子行:外键约束失败(gestikids_demochild_moments,CONSTRAINT fk_child_moments_moment_16 FOREIGN KEY(moment_id)参考momentsid))

但我在我的条目中正确添加了现有的moment_id。这是表格的定义:

CREATE TABLE `child_moments` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `child_id` bigint(20) DEFAULT NULL,
 `moment_id` bigint(20) DEFAULT NULL,
 `day` datetime DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `uq_child_moments_1` (`child_id`,`moment_id`,`day`),
 KEY `ix_child_moments_child_15` (`child_id`),
 KEY `ix_child_moments_moment_16` (`moment_id`),
 CONSTRAINT `fk_child_moments_child_15` FOREIGN KEY (`child_id`) REFERENCES `childs` (`id`),
 CONSTRAINT `fk_child_moments_moment_16` FOREIGN KEY (`moment_id`) REFERENCES `moments` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=196596 DEFAULT CHARSET=latin1

CREATE TABLE `moments` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 `is_meal` tinyint(1) DEFAULT '0',
 `sort` int(11) DEFAULT NULL,
 `pole_id` bigint(20) DEFAULT NULL,
 `type_id` bigint(20) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `ix_moments_pole_72` (`pole_id`),
 KEY `ix_moments_type_73` (`type_id`)
) ENGINE=MyISAM AUTO_INCREMENT=117 DEFAULT CHARSET=latin1

有什么问题?

我测试了手动输入数据,所有字段都填充了现有ID,但插入失败。

感谢您的帮助。

更新:如果我插入的数据没有moment_id,则插入成功。我检查了外键是否写得正确(约束中没有错误),但似乎没有。

更新2:

我尝试在另一个数据库中重新创建这两个表的简化版本,以查看错误是否与它们有关,并且我遇到以下错误:

  

无法创建表格' child_moments' (错误:150)

插入内容如下:

CREATE TABLE `child_moments` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `moment_id` bigint(20) DEFAULT NULL,
 `day` datetime DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `uq_child_moments_1` (`moment_id`,`day`),
 KEY `ix_child_moments_moment_16` (`moment_id`),
 CONSTRAINT `fk_child_moments_moment_16` FOREIGN KEY (`moment_id`) REFERENCES `moments` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `moments` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 `is_meal` tinyint(1) DEFAULT '0',
 `sort` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=latin1

如果我删除以下行,则插入成功:

 KEY `ix_child_moments_moment_16` (`moment_id`),
 CONSTRAINT `fk_child_moments_moment_16` FOREIGN KEY (`moment_id`) REFERENCES `moments` (`id`)

所以问题显然位于这些方面,但我不能解释为什么和为什么:/

1 个答案:

答案 0 :(得分:0)

由于MySQL Creating tables with Foreign Keys giving errno: 150

,我终于找到了问题

实际上这很简单:两个表没有相同的引擎!是的,moments是MyISAM,child_moment是InnoDB。

切换到InnoDB为我解决了这个问题。

希望它也能帮助别人!