48

我们正在尝试重命名 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 error 1025 (HY000): Error on rename of './foo' (errorno: 150) 是什么意思?

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

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

任何帮助将非常感激!

4

6 回答 6

57

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

于 2010-01-06T16:41:34.490 回答
27

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

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
于 2013-02-19T19:13:32.447 回答
3

这是常规键的 SQL 语法

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);
于 2012-09-28T15:56:36.847 回答
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';
于 2015-04-12T14:29:07.170 回答
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);
于 2016-04-30T15:11:15.160 回答
-2

如果您使用 GUI 工具,此任务会变得更简单。我尝试使用 IntelliJ IDEA数据库工具重命名 ID 列,它就像一个魅力!重命名表或列时,我不必担心外键。

在 IntelliJ IDEA 帮助中查看更多详细信息| 重命名项目

MySQL 5.7

于 2018-11-22T07:48:27.290 回答