Как переименовать внешний ключ в mysql? - PullRequest
27 голосов
/ 31 мая 2011

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

CONSTRAINT `conversation_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

К сожалению, где-то была ошибка, потому что мы хотели:

CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

Удаление и повторное добавление ограничения означало бы еще два длинных запроса. Есть ли способ переименовать ограничение в одном запросе?

Ответы [ 4 ]

56 голосов
/ 09 декабря 2012

Из документации :

Несколько ADD , ALTER , DROP и * 1012Предложения * CHANGE допускаются в одном операторе ALTER TABLE , разделенном запятыми. Это расширение MySQL к стандартному SQL, которое допускает только одно из каждого предложения для каждого оператора ALTER TABLE.

Таким образом, вы можете объединить удаление и воссоздание в одном запросе, иэто должно быть быстрее, чем сбросить ограничение и создать его в двух запросах:

ALTER TABLE conversation_tags
DROP FOREIGN KEY `conversation_tags_ibfk_1`,
ADD CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`);
6 голосов
/ 31 мая 2011

Извините, но ограничения могут быть удалены и повторно присоединены только в mySQL

1 голос
/ 31 мая 2011

Эта функция, по-видимому, недоступна в синтаксисе ALTER TABLE mysql.

Однако она поддерживается для Oracle.

0 голосов
/ 16 декабря 2015

Пожалуйста, обратитесь к моему ответу в В терминологии MySQL "ограничения" по сравнению с разницей "внешних ключей"? , чтобы понять, почему имя ограничения отличается от того, что вы хотели.Тем не менее, MySQL не имеет функции ограничения переименования и, следовательно, необходимо DROP и ADD FK с желаемым именем.https://dev.mysql.com/doc/refman/5.5/en/alter-table.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...