IF EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_SCHEMA = DATABASE()
AND TABLE_NAME='myTable'
AND INDEX_NAME = 'myIndex')
THEN
ALTER TABLE `myTable` DROP FOREIGN KEY `myForeignKey`;
ALTER TABLE `myTable` DROP INDEX `myIndex` ;
END IF;
При создании внешнего ключа, MySQL автоматически создает индекс на указанной колонке. В приведенном выше примере показано, как проверить индекс в INFORMATION_SCHEMA, но есть гораздо больше информации для вас, чтобы проверить в information schema. Ваше имя индекса указывает на то, что оно было создано для FK, поэтому вам придется сначала отказаться от FK, а затем отбросить индекс. Если вы снова создадите внешний ключ, mysql снова создаст индекс. Он нуждается в индексе для обеспечения ссылочной целостности без необходимости выполнять сканирование таблицы.
Если вы намеревались создать новый индекс, содержащий один и тот же столбец, сначала необходимо создать этот индекс (с этим столбцом, который будет использоваться как FK, первым в списке столбцы, указанные для индекса). Теперь вы можете добавить свой FK обратно, и mysql будет рад использовать новый индекс, не создавая другого.
Редактировать: для быстрого просмотра индексов просто выполните ПОКАЖИТЕ ИНДЕКСЫ из myTable;
Am использованием MYSQL, я попытался поставить это IF EXISTS, где бы я мог. Как проверить, существует ли внешний ключ перед его удалением? – Creditto
Какой двигатель хранения mysql вы используете? MYISAM или INNODB ?? Вы уверены, что не используете MYISAM? –
AM, используя механизм хранения INNODB в mysql, я попытался поместить этот IF EXISTS, где мог. Как проверить, существует ли внешний ключ перед его удалением? – Creditto