Ошибка 1059: слишком длинное имя идентификатора при ограничениях внешнего ключа из существующей таблицы

У меня есть несколько уже существующих таблиц в производственной базе данных. Когда я бегу show create table existing_table он показывает SQL, необходимый для создания таблицы, которая включает в себя несколько CONSTRAINT FOREIGN KEY REFERENCES включая ограничения с именами, такими как:

_xxxxxxxxxxx_xxxxxxxxxxx_xx_f87560e38ebd0f6_fk_customer_customer_id

Это кажется нормальным, но когда я пытаюсь создать таблицу tmp вроде new_existing_table который запускает тот же SQL, как показано в create table запрос, я получаю следующую ошибку:

ERROR 1059 (42000): Identifier name '_xxxxxxxxxxxx_xxxxxxx_xxxxxx_xx_7435260ed6a242b0_fk_customer_customer_id' is too long

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

Я использую MySQL, InnoDB на Amazon RDS.

1 ответ

Это похоже на проблему, связанную с MySQL Bug # 44541, которая была исправлена ​​в версиях MySQL Server 5.1.69, 5.5.31, 5.6.11 и 5.7.1.

Длина внутренних сгенерированных имен внешних ключей не проверялась. Если внутренне сгенерированные имена внешних ключей превышали ограничение в 64 символа, это приводило к недопустимому DDL из SHOW CREATE TABLE, Это исправление проверяет длину внутренних имен внешних ключей и выдает сообщение об ошибке, если ограничение превышено.

Проблема в том, что ошибка позволяла создавать таблицы с неверными определениями, поэтому важная здесь версия сервера - это не версия сервера, на которую вы пытаетесь загрузить, а версия сервера, которая работала, когда и где была таблица создано. Исправление не делает ничего, кроме того, что только что созданные таблицы могут иметь недопустимые автоматически генерируемые идентификаторы.

Идентификатор является идентификатором ограничения, и его значение не особенно важно - он используется только для того, чтобы сообщить вам в сообщении об ошибке ограничение внешнего ключа, которое должно было быть нарушено... так что вы можете просто удалить его. Единственный раз, когда вам нужно явно объявить это, когда автоматически сгенерированный будет слишком большим.

С http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html вы заметите, что ключевое слово CONSTRAINT не является обязательным, и даже если он symbol следовать по-прежнему необязательно. symbol это элемент, который дает вам проблему. Он ограничен 64 символами. Так было всегда, но из-за ошибки ограничение не было правильно установлено.

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
Другие вопросы по тегам