2011-11-17 39 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查询,上面的查询可能会快很多。但是,对于简单的列名更改,它可能很简单。我可能会尝试创建一个相同的表并在其上执行更改以查看您实际查看的时间。

相关问题