Ответ 1
AFAIK, отменив ограничение, затем переименуйте, а затем добавьте ограничение обратно - это единственный способ. Сначала резервное копирование!
Мы пытаемся переименовать столбец в 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. Похоже, нам придется сначала отказаться от внешнего ключа, затем переименовать, а затем снова добавить внешний ключ. Правильно ли это звучит? Есть ли лучший способ, поскольку это кажется довольно запутанным и громоздким?
Любая помощь будет очень признательна!
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`);
В следующем запросе будет создан правильный синтаксис автоматически. Просто выполните каждую строку, и все ваши 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';
Развернувшись на @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);