【问题标题】:MYSQL: Cannot add or update a child row: a foreign key constraint failsMYSQL:无法添加或更新子行:外键约束失败
【发布时间】:2011-03-31 12:33:27
【问题描述】:

我收到错误:

无法添加或更新子行:外键约束失败(mydb/requests, CONSTRAINT requests_ibfk_5 FOREIGN KEY (fixture_id) REFERENCES fixtures (fix_id) ON UPDATE CASCADE ON DELETE CASCADE)

我的表结构如下:

CREATE TABLE IF NOT EXISTS `requests` (
  `request_id` int(11) unsigned NOT NULL auto_increment,
  `fixture_id` int(11) unsigned NOT NULL,
  `user_id` int(11) unsigned NOT NULL,
  `date_added` datetime NOT NULL,
  `date_modified` datetime default NULL,
  PRIMARY KEY  (`request_id`),
  UNIQUE KEY `fixture_id_2` (`fixture_id`,`user_id`),
  KEY `user_id` (`user_id`),
  KEY `date_added` (`date_added`),
  KEY `fixture_id` (`fixture_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=17 ;


CREATE TABLE IF NOT EXISTS `fixtures` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `fix_id` int(11) unsigned NOT NULL default '0',
  `fixture_date` date default NULL,
  `kickoff` time default NULL,
  `venue` varchar(35) default NULL,
  `home_score` tinyint(4) default NULL,
  `away_score` tinyint(4) default NULL,
  `date_added` datetime default NULL,
  `date_modified` datetime default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `fix_id` (`fix_id`),
  KEY `fixture_date` (`fixture_date`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=383 ;


ALTER TABLE `requests`
  ADD CONSTRAINT `requests_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE,
  ADD CONSTRAINT `requests_ibfk_5` FOREIGN KEY (`fixture_id`) REFERENCES `fixtures` (`fix_id`) ON DELETE CASCADE ON UPDATE CASCADE;

如果我更新父表(fixtures)的 fix_id 字段上的记录,该记录在子表(requests)中有一个共享 id(fixture_id),我会收到上述错误。

我不明白为什么这个完整性约束会失败。两个表都已经有了应该级联的正确数据?

非常感谢任何帮助。

【问题讨论】:

  • 是否有您默认的 fix_id 0
  • 不,我在两个表中都没有该字段为 0 的记录。

标签: mysql foreign-keys referential-integrity


【解决方案1】:

这都是我自己的错误。在现实中,我在同一个领域有两个外国限制。我只需要脱一个。

【讨论】:

    【解决方案2】:

    此错误是由于引用了其他表而导致的,两个表中应该存在相同的 id/data。如果不是,请使用 where 条件删除不存在的数据。

    示例 update tablename a set = 'field' (select field from othertable b) where a.data = b.data;

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 2012-10-09
      • 2015-06-06
      • 2016-08-09
      • 2013-08-10
      • 1970-01-01
      • 2016-05-23
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多