我们正在尝试将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中重命名。看起来我们必须首先删除外键,然后重命名,然后再次添加外键。听起来不错吗?有没有更好的方法,因为这看起来很混乱和麻烦?
非常感谢任何帮助!
答案 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中查看更多详细信息。