我面临一个非常奇怪的MySQL问题,我在添加新行时遇到以下错误:
无法添加或更新子行:外键约束失败(
gestikids_demo
。child_moments
,CONSTRAINTfk_child_moments_moment_16
FOREIGN KEY(moment_id
)参考moments
(id
))
但我在我的条目中正确添加了现有的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`)
所以问题显然位于这些方面,但我不能解释为什么和为什么:/
答案 0 :(得分:0)
由于MySQL Creating tables with Foreign Keys giving errno: 150
,我终于找到了问题实际上这很简单:两个表没有相同的引擎!是的,moments
是MyISAM,child_moment
是InnoDB。
切换到InnoDB为我解决了这个问题。
希望它也能帮助别人!