2010-01-06 75 views
40

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

起初,我们试图使用Django南,但碰到了一个已知的问题:

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

OperationalError: (1025, "Error on rename of './xxx/#sql-bf_4d' to './xxx/cave_event' (errno: 150)")

Error on rename of './xxx/#sql-bf_4b' to './xxx/cave_event' (errno: 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

可能重复http://stackoverflow.com/questions/6188011/how-do- i-rename -a-foreign-key-in-mysql) – Ben 2015-01-09 14:05:27

回答

41

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

+5

由于MySQL 5.6.6,重命名列时现在所有外键都会自动更新。 http://dev.mysql.com/doc/refman/5.6/en/alter-table.html – BenL 2015-01-07 17:53:08

+2

@BenL这不完全正确。该页面说:“在MySQL 5.6.6之前,在某些情况下,在同一个ALTER TABLE语句中添加和删除一个外键可能会有问题,因此不受支持,每个操作都应该使用单独的语句。 ,ALTER TABLE ... ALGORITHM = INPLACE支持在ALTER TABLE语句中添加和删除外键,但对ALTER TABLE ... ALGORITHM = COPY不支持。“此外,我亲眼看到MySQL 5.6.2在FK中替换了列名。但在MySQL 5.0.94中,这还不是可能的。 – hypercube 2015-05-28 12:55:54

3

这里是正规钥匙

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

如果有人正在寻找语法的SQL语法,它是这样的:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id); 
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'; 
0

扩大对@杜威的回答,这里有一个小的脚本来重命名一个有用的方式("FK__" + table name + "__" + referenced table name)由Hibernate生成FKS。

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); 
的[?如何重新命名MySQL中的外键(