Как обновить значение внешнего ключа в базе данных MySQL - PullRequest
11 голосов
/ 24 сентября 2011

У меня есть три таблицы: категории, языки и категории_языков.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 - Не могу создать таблицу.121)

Ответы [ 2 ]

45 голосов
/ 24 сентября 2011

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

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

2 голосов
/ 25 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...