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

Pri*_*ome 12 mysql many-to-many foreign-keys

我有三个表:类别,语言和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;
Run Code Online (Sandbox Code Playgroud)

错误对我来说很清楚,但在这种情况下如何更新键值?我尝试添加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;
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*mio 46

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

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该在之前锁定表并在之后解锁它们以防止在编辑期间来自另一个会话的无效插入。 (2认同)

小智 6

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