Как обновить значение внешнего ключа в базе данных MySQL

у меня есть три таблицы: категории, языки и 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;

ошибки мне ясна, но как я могу обновить значение ключа в этом случае? Я попытался добавить UPDATA Каскад:

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' (errno: 121)

2 ответов


вы можете временно приостановить проверку внешнего ключа:

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 (ошибка удаленного ввода-вывода). Возможно, есть проблемы с разрешениями в целевой файловой системе или она не поддерживает # символов в именах файлов?


Если вы ищете временное решение, вы также можете изменить ON UPDATE действие CASCADE и измените свои идентификаторы