重命名MySQL中的外键列

Gre*_*tre 45 mysql sql foreign-keys mysql-error-1025

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

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

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

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

将'./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中重命名.看起来我们必须首先删除外键,然后重命名,然后再次添加外键.听起来不错吗?有没有更好的方法,因为这看起来很混乱和麻烦?

任何帮助将非常感激!

Dav*_*sky 51

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

  • 从MySQL 5.6.6开始,所有外键在重命名列时都会自动更新.http://dev.mysql.com/doc/refman/5.6/en/alter-table.html (8认同)
  • @BenL这不完全正确.该页面说:"在MySQL 5.6.6之前,在同一个ALTER TABLE语句中添加和删除外键在某些情况下可能会有问题,因此不受支持.每个操作都应该使用单独的语句.从MySQL 5.6.6开始ALTER TABLE ... ALGORITHM = INPLACE支持在同一个ALTER TABLE语句中添加和删除外键,但ALTER TABLE ... ALGORITHM = COPY仍然不支持." 此外,我亲眼目睹了MySQL 5.6.2替换FK中的列名.但是在mySQL 5.0.94中,这还不可能. (4认同)

34m*_*4m0 27

如果有人在寻找语法,它会像这样:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
Run Code Online (Sandbox Code Playgroud)