Невозможно добавить ограничение внешнего ключа после изменения набора символов - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть таблица, которую я использую для хранения текстовых сообщений в приложении. Я хотел добавить возможность использовать эмодзи, но они продолжали появляться как? ? ? ? и т.д ... в БД. Я узнал, что мне нужно изменить набор символов моей таблицы, поэтому я выполнил команду

ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

но я получил эту ошибку: Error Code: 1832. Cannot change column 'user_id': used in a foreign key constraint 'posts_ibfk_2'

поэтому я бросил FK, а затем запустил команду, и все работало отлично. Однако теперь, когда я пытаюсь прочитать FK, я получаю ошибку 1215, что не могу добавить ограничение FK.

ALTER TABLE posts
ADD FOREIGN KEY (user_id)
REFERENCES users(id);

Я попытался преобразовать набор символов обратно в исходное состояние и все еще не могу добавить FK. Как я могу добавить его обратно?

1 Ответ

0 голосов
/ 05 ноября 2018

Обратите внимание на выделенные жирным шрифтом точки, взятые из MySQL Docs :

Связи внешнего ключа включают родительскую таблицу, которая содержит центральные значения данных и дочерняя таблица с одинаковыми значениями, указывающими вернуться к родителю. Предложение FOREIGN KEY указано в дочернем Таблица. В родительской и дочерней таблицах должен использоваться один и тот же механизм хранения .

Соответствующие столбцы во внешнем ключе и ссылочном ключе должны имеют похожие типы данных . Размер и знак целочисленных типов должны быть тот же самый. Длина типов строк не обязательно должна быть одинаковой. Для недвоичные (символьные) строковые столбцы, набор символов и сопоставление должно быть одинаковым.

Когда включен foreign_key_checks, который является настройкой по умолчанию, преобразование набора символов не разрешено в таблицах, которые включают столбец строки символов, используемый в ограничении внешнего ключа.

В основном, после изменения набора символов и сопоставления поля , ссылающегося на в дочерней таблице; он не совпадает с набором символов и сопоставлением поля , на которое есть ссылка в родительской таблице. Вы должны убедиться, что они оба совпадают.

Итак, набор символов и сопоставление поля id в таблице users должны быть utf8mb4 и utf8mb4_bin соответственно. Предполагаю, что тип данных столбца id равен VARCHAR(32). Вы можете изменить его соответственно:

ALTER TABLE users 
MODIFY id VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...