重命名 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:

当您使用CHANGEMODIFY 时,column_definition 必须包含数据 类型和应该应用于新列的所有属性,其他 而不是索引属性,例如 PRIMARY KEYUNIQUE。属性 存在于原始定义中,但未为新定义指定 定义不结转。

【讨论】:

阿尔瓦罗,谢谢你的好回答!最后一段看起来像是我问题的明确答案。【参考方案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 表中的列,而不必重复其类型定义的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 重命名数据库表中的列?

重命名 MySQL 中的列

重命名 DB2 中的列

如何重命名 SQLite 数据库表中的列?

如何重命名数据透视查询中的列[重复]

重命名非常大的 CSV 数据文件的列 [重复]