2011-12-18 20 views
12

¿Es posible cambiar el nombre de una columna en MySQL sin tener que repetir su definición de tipo?Cambiar el nombre de una columna en la tabla mysql sin tener que repetir su definición de tipo

Por favor, sin tener que hackear en information_schema.

+2

no creo que es posible (a menos que piratear INFORMATION_SCHEMA). –

+0

@Tomas Puedo preguntarle en qué tipo de situación deberíamos cambiar el nombre de una columna sin repetir su definición de tipo? Gracias :) – tyger

+1

@tyger, en Si solo quiere renombrar la columna – TMS

Respuesta

9

El ALTER TABLE syntax no parece ofrecer tal posibilidad:

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:

Cuando se utiliza CHANGE o MODIFY, column_definition debe incluir los datos tipo y todos los atributos que deberían aplicarse a la nueva columna, otra que atributos de índice como PRIMARY KEY o UNIQUE. Los atributos presentes en la definición original pero no especificados para la nueva definición no se transfieren.

+0

Alvaro, ¡gracias por la buena respuesta! El último párrafo parece la respuesta definitiva a mi pregunta. – TMS

1

En mi caso, quería cambiar todos los columnNames de "id_something" a "idSomething" para luego poder cargar datos a mi objeto C# más rápido y fácil. Yo estaba buscando un script para hacer eso y parece imposible encontrar :( Finalmente lo hice por mí mismo en C# Aquí tienes las funciones principales que he utilizado:

Me gustaría que será muy útil para todo el mundo!

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; 
    } 
Cuestiones relacionadas