2011-12-18 38 views
12

是否可以重命名MySQL中的列而不必重複其類型定義?重命名mysql表中的列而不必重複其類型定義

請不必侵入information_schema。

+2

不認爲這是可能的(除非你砍INFORMATION_SCHEMA)。 – 2011-12-18 16:41:31

+0

@Tomas我能在這樣的情況,我們應該重命名列,而不問其重複的類型定義?謝謝:) – tyger 2011-12-18 17:38:18

+1

@tyger,在如果你只是想重命名列 – TMS 2011-12-19 08:48:12

回答

9

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。原始定義中存在的屬性 未被指定用於新的 定義。

+0

阿爾瓦羅,謝謝你的好回答!最後一段看起來像是我的問題的確切答案。 – TMS 2011-12-19 08:47:28

1

在我的情況下,我想將所有columnNames從「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; 
    }