Переименование столбцов внешнего ключа в 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';