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

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

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

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

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

и

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

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

что делает mysql error 1025 (HY000): ошибка при переименовании './foo' (errorno: 150) mean?

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

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

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

5 ответов


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


если кто-то ищет синтаксис что-то вроде этого:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

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

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

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

расширение на ответ @Dewey, вот небольшой скрипт для переименования FKs, генерируемых Hibernate полезным образом ("FK__" + table name + "__" + referenced table name).

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);

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

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

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';