2011-12-18 51 views
12

Có thể đổi tên một cột trong MySQL mà không phải lặp lại định nghĩa kiểu của nó không?Đổi tên một cột trong bảng mysql mà không phải lặp lại định nghĩa kiểu

Vui lòng không cần phải xâm nhập vào information_schema.

+2

Đừng nghĩ rằng nó có thể (trừ khi bạn hack information_schema). –

+0

@Tomas tôi có thể hỏi, trong đó loại tình hình chúng ta nên đổi tên một cột mà không lặp lại định nghĩa kiểu của nó? Cảm ơn :) – tyger

+1

@tyger, trong trường hợp bạn chỉ muốn đổi tên cột – TMS

Trả lời

9

Các ALTER TABLE syntax dường như không cung cấp khả năng như vậy:

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:

Khi bạn sử dụng CHANGE hoặc MODIFY, column_definition phải bao gồm các dữ liệu loại và tất cả các thuộc tính mà nên áp dụng đối với cột mới, khác so với các thuộc tính chỉ mục như PRIMARY KEY hoặc UNIQUE. Các thuộc tính có trong định nghĩa ban đầu nhưng không được chỉ định cho định nghĩa mới không được chuyển tiếp.

+0

Alvaro, cảm ơn bạn đã trả lời tốt! Đoạn cuối cùng trông giống như câu trả lời nhất định cho câu hỏi của tôi. – TMS

1

Trong trường hợp của mình, tôi muốn thay đổi tất cả các cột từ "id_something" thành "idSomething", sau đó có thể tải dữ liệu vào đối tượng C# của tôi nhanh hơn và dễ dàng hơn. Tôi đang tìm kiếm một kịch bản để làm điều đó và có vẻ như không thể tìm thấy :( Cuối cùng tôi đã làm nó một mình trong C# Ở đây bạn có các chức năng chính mà tôi đã sử dụng:

tôi muốn nó sẽ có ích cho tất cả mọi người!

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; 
    } 
Các vấn đề liên quan