Как обновить значение внешнего ключа в базе данных 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
и измените свои идентификаторы