Переименование столбцов с внешним ключом в MySQL - PullRequest
44 голосов
/ 06 января 2010

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

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

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

OperationalError: (1025, «Ошибка при переименовании файла.

И

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

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

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

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

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

Любая помощь будет высоко ценится!

Ответы [ 6 ]

50 голосов
/ 06 января 2010

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

25 голосов
/ 19 февраля 2013

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

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
3 голосов
/ 28 сентября 2012

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

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);
0 голосов
/ 22 ноября 2018

Эта задача упрощается, если вы используете инструменты с графическим интерфейсом. Я попытался переименовать столбец идентификаторов, используя IntelliJ IDEA Инструмент для баз данных , и это сработало как шарм! Мне не нужно беспокоиться о внешних ключах при переименовании таблицы или столбца.

Подробнее см. В IntelliJ IDEA Help | Переименование предметов .

MySQL 5.7

0 голосов
/ 30 апреля 2016

Расширяя ответ @ Dewey, вот небольшой скрипт для переименования FK, сгенерированных 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);
0 голосов
/ 12 апреля 2015

Следующий запрос автоматически создаст правильный синтаксис. Просто выполните каждую возвращенную строку, и все ваши 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...