在一个巨大的表中更改mysql字段名称

时间:2012-12-07 21:33:46

标签: mysql alter

我有一个包含2100万行的表。我必须更改其中一个行名。当我尝试查询“alter table company change id new_id int(11)”;查询永远不会结束。

是否有一种简单的方法可以更改大型mysql表的字段名称?

5 个答案:

答案 0 :(得分:5)

首先,在任何事情之前,备份表:

mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql

执行ALTER命令时要记住的一件事是绝对确保您拥有相同的列详细信息,以便您不想更改。

例如:

ALTER TABLE big_table MODIFY COLUMN id INT(11)

会跳过其他任何内容,例如AUTO_INCREMENTNOT NULL。因此最好将其包含在alter语句中。

ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;

基本上只需复制ID列的create语句区域并替换您想要的内容并将其包含在modify语句中。

答案 1 :(得分:3)

使用pt-online-schema-change进行长时间运行的ALTER TABLE更改,而不会将自己锁定在表之外。

http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html

通常需要更长时间来完成更改,但您仍然可以在工作时继续读取和写入表格。

您还可以收听作者的网络研讨会,讨论它是如何运作的,以及它的一些警告:

http://www.percona.com/webinars/2012-05-02-zero-downtime-schema-changes-in-mysql

答案 2 :(得分:1)

您可以执行以下操作:

MyISAM表

CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
ALTER TABLE big_table_new DISABLE KEYS;
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table_new ENABLE KEYS;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;

InnoDB表

CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;

完成后,big_table_bak就是您的备份。

如果您对新big_table感到满意,可以运行

DROP TABLE big_table_bak;

如果你想还原,你可以运行

DROP TABLE big_table;
ALTER TABLE big_table_bak RENAME big_table;

试一试!!!

答案 3 :(得分:1)

在巨大的Mysql表中更改字段名称的耗时较少的方法是:

CREATE TABLE new_big_table SELECT id as new_id,field1,field2,field3 FROM big_table。

答案 4 :(得分:0)

您如何看待:

  1. 导出所有数据并截断表
  2. alter table
  3. 更改导出文件中的行名称
  4. 导入文件
  5. 这只是一个快速的想法,但它不会很快(导出/导入)。

    或者只是尝试在晚上几小时维护期间进行更换? :)