2010-05-27 80 views
0

我有一个大约有40个表的数据库,需要重命名每个索引列。重命名INDEX列

IE用户表中有像

user_id | user_username | user_password | etc... 

我想ID列重命名只是ID IE

id | user_username | user_password | etc... 

一堆领域,但我一直在alter table命令使MySQL错误即。

ALTER TABLE database RENAME COLUMN user_id to id;

加上许多不同的变化。

最好的办法是做什么?

希望你能劝

+0

什么错误信息你得到? – 2010-05-27 20:01:45

回答

0

你将不得不放弃所有的外键约束,更改主键,然后再添加约束。

顺便说一句,改变主键是一件非常严肃的事情,如果你真的需要,你应该只做它。此更改将打破使用数据库的每个应用程序。

0

如果我是你,我不会这样做。在做这些之前,我会想出如何改变你需要做的任何事情。除非您是数据库结构的工程师或使用它的软件工程师,否则这是永远不会被建议或推荐的。这样做就像把糖,水,可乐&沙子放在一个油箱里,然后说:“哎,出什么事了?”

即使这个家伙在上面谈到放弃约束并把它们都放回去。这对于数据库工程/结构来说都很好,但即使这样做了,使用它们的应用程序也有自己的问题。做一个搜索替换数据库列名也是行不通的。特别是随着你看到的命令结构,你只会把代码搞乱。

0

你应该能够做到这一点,每个表,通过类似以下的(注代码:我认为每个*_id字段的列描述为INTEGER NOT NULL,而这些相同的字段有AUTO_INCREMENT集这是非常正常的。一个ID列。)

# remove auto_increment, allows us to remove primary key 
ALTER TABLE user MODIFY user_id INTEGER NOT NULL; 

# remove primary key, allows us to change column name 
ALTER TABLE user DROP PRIMARY KEY; 

# change column name, re-add auto_increment and primary key 
ALTER TABLE user CHANGE user_id id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY; 

虽然注意到其他人的警告。除非这是你的创建(并且你刚刚决定在项目中或早些时候改变命名约定),否则改变它将打破任何其他希望与此数据库接口的代码。

希望这有助于

安东尼

编辑:上述假设你没有外键约束,在其他表显式引用user.user_id列。如果不是这种情况,您必须在更改名称之前删除所有外键约束,然后在之后重新添加它们。如果你不确定那里有你的数据库外键关系,你可以列出他们都用下面的代码(从http://www.xinotes.org/notes/note/477/复制到改善答案的复制/粘贴能力):

SELECT CONCAT(table_name, '.', column_name, ' -> ', referenced_table_name, '.', referenced_column_name) 
FROM information_schema.key_column_usage 
WHERE referenced_table_schema = schema() 
AND referenced_table_name is not null 
ORDER BY table_name, column_name;