重命名mysql表中的列而不必重复其类型定义
Posted
技术标签:
【中文标题】重命名mysql表中的列而不必重复其类型定义【英文标题】:Rename a column in mysql table without having to repeat its type definition 【发布时间】:2012-01-23 02:22:51 【问题描述】:是否可以在 mysql 中重命名列而不必重复其类型定义?
请不要侵入 information_schema。
【问题讨论】:
不要认为这是可能的(除非你破解 information_schema)。 @Tomas 请问在哪种情况下我们应该重命名列而不重复其类型定义?谢谢:) @tyger,如果您只想重命名该列 破解information_schema
很糟糕吗?
【参考方案1】:
ALTER TABLE syntax 似乎不提供这种可能性:
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
partition_options
alter_specification:
table_options
[...]
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
[...]
More specifically:
当您使用
CHANGE
或MODIFY
时,column_definition 必须包含数据 类型和应该应用于新列的所有属性,其他 而不是索引属性,例如PRIMARY KEY
或UNIQUE
。属性 存在于原始定义中,但未为新定义指定 定义不结转。
【讨论】:
阿尔瓦罗,谢谢你的好回答!最后一段看起来像是我问题的明确答案。【参考方案2】:就我而言,我想将所有列名从“id_something”更改为“idSomething”,以便能够更快、更轻松地将数据加载到我的 C# 对象中。我正在寻找一个脚本来做到这一点,它看起来不可能找到:( 最后我自己用 C# 完成了 这里有我使用的主要功能:
希望对大家有用!
public bool columnesRename(string oldName, string newName, string dataBase, string dataTable)
bool res = true;
string definicio = columnaDefinicioGet(oldName, dataBase, dataTable);
cmd.CommandText = String.Format("alter table 0 change 1 2 3 ", dataTable, oldName, newName, definicio);
Debug.WriteLine(String.Format("canviant taula 0: 1 per 2", dataTable, oldName, newName));
Debug.WriteLine(cmd.CommandText);
Debug.WriteLine(cmd.ExecuteNonQuery());
return res;
public string columnaDefinicioGet(string columna, string dataBase, string dataTable)
string definicio = "";
cmd.CommandText = String.Format
(
@"select column_type, is_nullable, extra, column_default from information_schema.columns where table_schema = '0' and table_name = '1' and column_name = '2'"
, dataBase, dataTable, columna
);
MySqlDataReader dr = cmd.ExecuteReader();
dr.Read();
string nulONo = (dr[1].ToString() == "NO") ? "NOT NULL" : "NULL";
string valorDefault = (dr[3].ToString() == "NULL" || dr[3].ToString() == "") ? dr[3].ToString() : "DEFAULT '" + dr[3].ToString() + "'";
definicio = String.Format("0 1 2 3", dr[0], nulONo, dr[2], valorDefault);
dr.Close();
return definicio;
【讨论】:
以上是关于重命名mysql表中的列而不必重复其类型定义的主要内容,如果未能解决你的问题,请参考以下文章