#mysql #sql #innodb
#mysql #sql #innodb
Вопрос:
У меня более 500 таблиц в БД, и мне нужно переименовать все столбцы всех таблиц. Ядро базы данных — InnoDB. В настоящее время я выполняю для каждой таблицы
ALTER TABLE RENAME db.table CHANGE oldID newID INT, CHANGE oldDESC newDESC VARCHAR(50);
И это не удается (ошибка: 150) в определенных таблицах, поскольку они имеют ограничения внешнего ключа, ссылающиеся на другие таблицы.
Есть ли более разумный способ сделать это и избежать этих страшных ошибок?
Ответ №1:
Вы можете попробовать отключить проверки внешних ключей во время выполнения обновления, а затем снова включить их
РЕДАКТИРОВАТЬ: возможно, это может помочь
START TRANSACTION;
SET foreign_key_checks = 0; -- off
.. do stuff here
SET foreign_key_chekcs = 1; -- on.
COMMIT;
Комментарии:
1. Убедитесь, что вы действительно отключили их. Но в случае, если mysql не позволит вам сделать это по какой-либо причине, я думаю, вы можете попытаться удалить их, а затем вернуть их обратно. это сложнее. я не знаю, как вы можете сделать резервную копию своих внешних ключей, чтобы восстановить их, но я думаю, что должно быть решение.
2. И как мне узнать, действительно ли я отключил внешние ключи. Я попытался переместить НАБОР foreign_key_checks = 0; непосредственно перед моим процессом переименования, но даже это не удается.
3. я не знаю вашей настройки. попробуйте выполнить простой тест, как в вашем примере. отключите проверки, чем запустите sql для изменения таблицы. лучше сделать это в phpmyadmin или консоли mysql, чтобы избежать каких-либо зависимостей
4. кроме того, не забывайте, что когда вы делаете резервное копирование / восстановление своей базы данных, mysql будет включать отключение проверки внешних ключей перед импортом данных и устанавливать их в конце. и это работает. или это должно сработать. если нет, то у вас могут возникнуть проблемы с вашей установкой: s
5. Хорошо! Является ли MyISAM в любом случае менее строгим, чем InnoDB, см. Я работаю над тестовой платформой, поэтому я могу сделать здесь несколько необычных вещей, чтобы заставить БД работать. Можно ли преобразовать все таблицы в MyISAM, а затем выполнить переименование. Это было бы проще?