2011-11-17 52 views

回答

6

不幸的是需要MySQL來重命名一列(使用ALTER TABLE ... CHANGE COLUMN)來運行一個完整的表副本。

結帳pt-online-schema-change。這有助於在ALTER期間不鎖定整個表的情況下對錶進行多種類型的ALTER更改。在將數據複製到新表中時,您可以繼續讀取和寫入原始表。通過觸發器捕獲更改並將其應用於新表。

例子:

pt-online-schema-change h=localhost,D=databasename,t=tablename \ 
    --alter 'CHANGE COLUMN oldname newname NUMERIC(9,2) NOT NULL' 

更新:的MySQL 5.6可以做一些類型的ALTER操作不重建表,並更改列的名稱是那些支持作爲一個在線的變化之一。請參閱http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html以瞭解哪些類型的改動可以支持或不支持。

0

如果沒有任何限制,就可以毫不費力地改變它,據我所知。如果您必須先刪除約束,請修改並添加約束。

0

更改包含多行的表可能需要很長時間(但如果所涉及的列未編入索引,則可能很簡單)。

如果你特別要避免使用專門爲此設立了ALTER TABLE語法,你總是可以創建具有幾乎相同的結構(但不同的名稱)的表,所有的數據複製到它,像這樣:

CREATE TABLE `your_table2` ...; 
    -- (using the query from SHOW CREATE TABLE `your_table`, 
    -- but modified with your new column changes) 

LOCK TABLES `your_table` WRITE; 
INSERT INTO `your_table2` SELECT * FROM `your_table`; 
RENAME TABLE `your_table` TO `your_table_old`, `your_table2` TO `your_table`; 

對於某些ALTER TABLE查詢,上面的查詢可能會快很多。但是,對於簡單的列名更改,它可能很簡單。我可能會嘗試創建一個相同的表並在其上執行更改以查看您實際查看的時間。

相關問題