MySQL, переименовать все столбцы всех таблиц в БД

#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, а затем выполнить переименование. Это было бы проще?