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

更改列名而不重新创建MySQL表,mysql,alter,Mysql,Alter,有没有一种方法可以在InnoDB表中重命名一列而不进行重大更改 这张表相当大,我想避免大的停机时间。如果没有任何限制,据我所知,您可以毫不费力地修改它。如果存在约束,则必须先删除约束,然后更改并重新添加约束。更改一个包含多行的表可能需要很长时间(尽管如果所涉及的列没有索引,这可能很简单) 如果您特别希望避免使用专门为此目的创建的语法,则始终可以创建一个结构几乎完全相同(但名称不同)的表,并将所有数据复制到其中,如下所示: CREATE TABLE `your_table2` ...; -

有没有一种方法可以在InnoDB表中重命名一列而不进行重大更改


这张表相当大,我想避免大的停机时间。

如果没有任何限制,据我所知,您可以毫不费力地修改它。如果存在约束,则必须先删除约束,然后更改并重新添加约束。

更改一个包含多行的表可能需要很长时间(尽管如果所涉及的列没有索引,这可能很简单)

如果您特别希望避免使用专门为此目的创建的语法,则始终可以创建一个结构几乎完全相同(但名称不同)的表,并将所有数据复制到其中,如下所示:

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`;
对于一些ALTERTABLE查询,上面的操作可能会快一些。然而,对于一个简单的列名更改,它可能是微不足道的。我可能会尝试创建一个相同的表并对其执行更改,以查看您实际查看的时间。

很遗憾,重命名列(使用
ALTER table…change column
)需要MySQL运行完整的表副本

退房。这有助于您对表进行多种类型的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操作,而更改列名是支持在线更改的操作之一。有关哪些类型的更改支持或不支持此操作的概述,请参阅。

只需查看ALTER的语法即可。