Переименуйте столбец в таблице MySQL без повторения определения его типа - PullRequest
15 голосов
/ 18 декабря 2011

Можно ли переименовать столбец в MySQL без необходимости повторять определение его типа?

Пожалуйста, без необходимости взломать информационную_схему.

Ответы [ 2 ]

11 голосов
/ 18 декабря 2011

Синтаксис ALTER TABLE , по-видимому, не предоставляет такой возможности:

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]
[...]

Более конкретно :

Когда вы используете CHANGE или MODIFY, column_definition должно включать данные тип и все атрибуты, которые должны применяться к новому столбцу, другие чем атрибуты индекса, такие как PRIMARY KEY или UNIQUE. Атрибуты присутствует в первоначальном определении, но не указано для нового определение не переносится.

1 голос
/ 07 января 2012

В моем случае я хотел изменить все 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;
    }
...