如何更新mysql数据库中的外键值

时间:2011-09-24 19:43:44

标签: mysql foreign-keys many-to-many

我有三个表:类别,语言和categories_languages。 Categories_languages是多对多的表格,它们将类别和语言联系在一起。我想更新表语言中的foregin键值,但它会抛出错误#1451 - 无法删除或更新父行:外键约束失败!

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(20) NOT NULL,
  `modified` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `languages` (
  `id` char(2) NOT NULL,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `categories_languages` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `category_id` int(11) unsigned NOT NULL,
  `language_id` char(2) NOT NULL,
  `translation` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_category_id_language_id` (`category_id`,`language_id`),
  KEY `fk_language_id` (`language_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

ALTER TABLE `categories_languages`
  ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE;

错误很明显,但在这种情况下如何更新键值?我尝试添加ON UPDATA CASCADE:

ALTER TABLE `categories_languages`
  ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

但是也失败并显示消息:MySQL说:文档#1005 - 无法创建表'。/ db_dodo / #sql-c2f_80e6f.frm'(错误号:121)

2 个答案:

答案 0 :(得分:44)

您可以暂时暂停外键检查:

SET foreign_key_checks = 0;
UPDATE languages SET id='xyz' WHERE id='abc';
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc';
SET foreign_key_checks = 1;

编辑:至于外键问题:是存储在本地还是远程文件系统上的数据? errno 121是EREMOTEIO(远程I / O错误)。也许目标文件系统存在权限问题,或者它不支持文件名中的#字符?

答案 1 :(得分:2)

如果您正在寻找临时解决方案,您还可以将ON UPDATE操作更改为CASCADE并修改您的ID