Использование MySQL 5.5. У меня есть таблица, для которой я не могу добавить внешний ключ:
ИЗМЕНИТЬ ТАБЛИЦУ `SOURCE_TABLE`
ДОБАВИТЬ ОГРАНИЧЕНИЕ `ConstraintFK`
ВНЕШНИЙ КЛЮЧ ("otherTableID")
ССЫЛКИ `OTHER_TABLE` (`id`)
НА УДАЛИТЬ УСТАНОВИТЬ НУЛЕВОЕ
НА КАСКАД ОБНОВЛЕНИЙ;
MySQL возвращает следующую ошибку:
Код ошибки: 1005. Не удается создать таблицу my_schema.#sql-4c0c_b6fc8ca (номер ошибки: 121)
Смотря на ПОКАЗАТЬ СТАТУС INNODB ДВИГАТЕЛЯ
Я получил:
------------------------
ПОСЛЕДНЯЯ ОШИБКА ВНЕШНЕГО КЛЮЧА
------------------------
220523 16:34:36 Ошибка при создании ограничения внешнего ключа для таблицы `my_schema`.`#sql-4c0c_b6fc8ca`.
Ограничение внешнего ключа с именем `my_schema`.`ConstraintFK`
уже существует. (Обратите внимание, что внутренне InnoDB добавляет «имя базы данных»
перед определяемым пользователем именем ограничения.)
Обратите внимание, что системные таблицы FOREIGN KEY InnoDB хранят
имена ограничений нечувствительны к регистру, с
Стандартная сортировка MySQL latin1_swedish_ci. если ты
создавать таблицы или базы данных, имена которых отличаются только
регистр символов, затем коллизии в ограничении
имена могут встречаться. Обходной путь: назовите свои ограничения
явно с уникальными именами.
Конечно, в этой схеме не определено ограничение с именем ConstraintFK, я проверил как информационную схему, так и ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ SOURCE_TABLE
вывод. Последнее показывает, что индекс для внешнего ключа существует, но ограничения внешнего ключа, похоже, нет:
-- показывается только релевантная информация
СОЗДАТЬ ТАБЛИЦУ `SOURCE_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`otherTableID` int(11) ПО УМОЛЧАНИЮ NULL,
ПЕРВИЧНЫЙ КЛЮЧ (`id`),
KEY `ConstraintFK_idx` (`otherTableID`)
) ENGINE=InnoDB AUTO_INCREMENT=4089 НАБОР ШИМОВ ПО УМОЛЧАНИЮ=utf8;
СОЗДАТЬ ТАБЛИЦУ `OTHER_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
ПЕРВИЧНЫЙ КЛЮЧ (`id`),
) ENGINE = InnoDB AUTO_INCREMENT = 58108 НАБОР ШИМОВ ПО УМОЛЧАНИЮ = utf8;
Действительно, если я попытаюсь снять это ограничение:
ИЗМЕНИТЬ ТАБЛИЦУ `SOURCE_TABLE`
УДАЛИТЬ ВНЕШНИЙ КЛЮЧ `ConstraintFK`;
Я получил:
Код ошибки: 1025.Ошибка при переименовании «./my_schema/SOURCE_TABLE» в «./my_schema/#sql2-4c0c-b6fc8ca» (номер ошибки: 152)
Я посмотрел на файловую систему и не вижу причин, по которым переименование таблицы должно завершиться неудачей.
К сожалению, попытка запросить информационную схему не помогает:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
ГДЕ information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'ВНЕШНИЙ КЛЮЧ'
AND information_schema.TABLE_CONSTRAINTS.CONSTRAINT_NAME = 'ConstraintFK';
возвращает пустой набор, а:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
ГДЕ information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'ВНЕШНИЙ КЛЮЧ'
AND information_schema.TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA = 'моя_схема';
возвращает все ограничения внешнего ключа в my_schema, которые я также могу получить из ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ
заявления, но никаких признаков ConstraintFK...
Смотря на это и это, я подозреваю, что что-то произошло в прошлом, что привело к тому, что этот внешний ключ стал сиротой: действительно, эта SOURCE_TABLE была переименована некоторое время назад, и я почти уверен, что внешний ключ, который я пытаюсь добавить, был там в прошлом. Предлагаемый обходной путь — удалить схему и воссоздать ее из файла дампа. Есть ли что-нибудь еще, что я могу попробовать, что не связано с удалением этой схемы? Это довольно огромно, и время простоя будет иметь значение.