在MySQL中重命名外键列

我们试图将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错误1025(HY000):'./foo'(errorno:150)重命名错误是什么意思?

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

所以,现在我们正在尝试在原始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`); 

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

扩展@ Dewey的答案,这里有一个小脚本,以有用的方式(“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);