Ошибка 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]