簡體   English   中英

更改列名而不重新創建MySQL表

[英]Change column name without recreating the MySQL table

有沒有辦法重命名InnoDB表上的列而沒有重大改變?

該表非常大,我想避免重大停機時間。

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

查看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

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

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

如果您特別希望避免使用專門為此目的創建的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查詢,上面的速度可能會快得多。 但是,對於簡單的列名更改,它可能是微不足道的。 我可能會嘗試創建一個相同的表並對其進行更改,以便查看您實際查看的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM