Изменить таблицу MySQL с ограничением внешнего ключа

Есть две таблицы новости и язык. Это исходная таблица в MySQL:

CREATE TABLE `news` (
`news_id` int(11) NOT NULL AUTO_INCREMENT,
`fleet_id` int(11) NOT NULL,
`channel_id` int(11) NOT NULL,
`effective_from` date NOT NULL,
`effective_to` date NOT NULL,
`news` text,
PRIMARY KEY (`news_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `language` (
`ietf_language_tag` varchar(5) NOT NULL,
`endonym` varchar(32) NOT NULL,
`exonym` varchar(32) NOT NULL,
 PRIMARY KEY (`ietf_language_tag`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/* Выполнить команду изменения таблицы */

ALTER TABLE news
ADD ietf_language_tag varchar(5) NOT NULL,
ADD KEY (ietf_language_tag) ,
ADD CONSTRAINT news_fkey1 FOREIGN KEY (ietf_language_tag) REFERENCES   
language(ietf_language_tag) ON DELETE NO ACTION  ON UPDATE NO ACTION ;

/* получаем ошибку */

Ошибка:

14:57:51 ALTER TABLE news ДОБАВИТЬ ietf_language_tag varchar(5) NOT NULL, ДОБАВИТЬ КЛЮЧ
(ietf_language_tag), ДОБАВИТЬ ОГРАНИЧЕНИЕ news_fkey1 FOREIGN KEY (ietf_language_tag)
ССЫЛКИ language(ietf_language_tag) ПРИ УДАЛЕНИИ НЕТ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ
Код ошибки: 1215. Невозможно добавить ограничение внешнего ключа 0,437 сек.


person user3205128    schedule 17.01.2014    source источник
comment
Судя по вашему sql, я не уверен, что ваша проблема такая же, как у меня, попробуйте.   -  person Leo Zhao    schedule 23.01.2014


Ответы (1)


проблема с набором символов

И news, и language имеют разные наборы символов latin1 для news, utf8 для language.

FOREIGN_KEY_CHECKS

Несмотря на то, что наборы символов одинаковы, вы получите сообщение об ошибке, если у вас есть записи в таблице news следующим образом.

ОШИБКА 1452 (23000): Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает (db_name.#sql-296_72a7a, ОГРАНИЧЕНИЕ news_fkey1 FOREIGN KEY (ietf_language_tag) ССЫЛКИ language (ietf_language_tag) ПРИ УДАЛЕНИИ НЕТ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ)

эту проблему можно решить с помощью SET FOREIGN_KEY_CHECKS = 0;

mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE news
    -> ADD ietf_language_tag varchar(5) NOT NULL,
    -> ADD KEY (ietf_language_tag) ,
    -> ADD CONSTRAINT news_fkey1 FOREIGN KEY (ietf_language_tag) REFERENCES
    -> language(ietf_language_tag) ON DELETE NO ACTION  ON UPDATE NO ACTION ;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
person Jason Heo    schedule 21.03.2014