重命名MySQL中的外键列

时间:2010-01-06 16:39:03

标签: sql mysql foreign-keys mysql-error-1025

我们正在尝试将MySQL(5.1.31,InnoDB)中的列重命名为另一个表的外键。

起初,我们尝试使用Django-South,但遇到了一个已知问题:

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

  

操作错误:(1025,“将./xxx/#sql-bf_4d'重命名为'./xxx/cave_event'(错误号:150)时出错”)

  

将'./xxx/#sql-bf_4b'重命名为'./xxx/cave_event'时出错(错误号码:150)

此错误150肯定与外键约束有关。参见例如

What does mysql error 1025 (HY000): Error on rename of './foo' (errorno: 150) mean?

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

所以,现在我们正在尝试在原始SQL中重命名。看起来我们必须首先删除外键,然后重命名,然后再次添加外键。听起来不错吗?有没有更好的方法,因为这看起来很混乱和麻烦?

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:50)

AFAIK,删除约束,然后重命名,然后添加约束是唯一的方法。先备份!

答案 1 :(得分:25)

如果有人在寻找语法,那就是这样的:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

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

答案 2 :(得分:3)

这是常规键的SQL语法

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

答案 3 :(得分:0)

以下查询将自动构建正确的语法。 只需执行返回的每一行,所有的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';

答案 4 :(得分:0)

扩展@Dewey的答案,这是一个小脚本,以有用的方式重命名Hibernate生成的FK ("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);

答案 5 :(得分:0)

如果使用GUI工具,此任务将变得更加简单。我尝试使用IntelliJ IDEA Database tool重命名ID列,它的工作原理很吸引人!重命名表或列时不必担心外键。

IntelliJ IDEA Help | Renaming items中查看更多详细信息。

MySQL 5.7