Переименование столбцов внешнего ключа в MySQL

Мы пытаемся переименовать столбец в MySQL (5.1.31, InnoDB), который является внешним ключом для другой таблицы.

Сначала мы пытались использовать Django-South, но столкнулись с известной проблемой:

http://south.aeracode.org/ticket/243

OperationalError: (1025, "Ошибка при переименовании". /xxx/ #sql-bf_4d 'в'./xxx/cave_event '(errno: 150) ")

и

Ошибка при переименовании './xxx/#sql-bf_4b' в './xxx/cave_event' (errno: 150)

Эта ошибка 150 определенно относится к ограничениям внешнего ключа. См., Например,

Что такое mysql error 1025 (HY000): ошибка при переименовании './foo' (errno: 150) означает?

http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained/

Итак, теперь мы пытаемся переименовать в raw SQL. Похоже, нам придется сначала отказаться от внешнего ключа, затем переименовать, а затем снова добавить внешний ключ. Правильно ли это звучит? Есть ли лучший способ, поскольку это кажется довольно запутанным и громоздким?

Любая помощь будет очень признательна!

Ответ 1

AFAIK, отменив ограничение, затем переименуйте, а затем добавьте ограничение обратно - это единственный способ. Сначала резервное копирование!

Ответ 2

Если кто-то ищет синтаксис, он выглядит примерно так:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);

Ответ 3

вот синтаксис SQL для обычных клавиш

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);

Ответ 4

В следующем запросе будет создан правильный синтаксис автоматически. Просто выполните каждую строку, и все ваши FKEY исчезнут.

Я оставляю обратное (добавление их обратно) в качестве упражнения для вас.

SELECT CONCAT ( "alter table", TABLE_NAME, "drop foreign key ", CONSTRAINT_NAME,";" ) AS runMe FROM information_schema.key_column_usage WHERE TABLE_SCHEMA = 'MY_SCHEMA_NAME';

Ответ 5

Развернувшись на @Dewey, ответьте здесь немного script, чтобы переименовать FK, сгенерированные Hibernate полезным способом ( "FK__" + имя таблицы + "__" + имя таблицы ссылок).

SELECT CONCAT( "alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n", "alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n", "alter table ", TABLE_NAME, " add key FK__", table_name, "__", referenced_table_name, " (", column_name, ");\n", "alter table ", TABLE_NAME, " add constraint FK__", table_name, "__", referenced_table_name , " foreign key (", column_name, ") ", "references ", referenced_table_name, "(", referenced_column_name, ");" ) AS runMe FROM information_schema.key_column_usage WHERE TABLE_SCHEMA='myschemaname' AND constraint_name like 'FK_%';

Немного выхода:

alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47; alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47; alter table visitor_browsers add key FK__visitor_browsers__websites (website); alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id);