我有一个包含2100万行的表。我必须更改其中一个行名。当我尝试查询“alter table company change id new_id int(11)”;查询永远不会结束。
是否有一种简单的方法可以更改大型mysql表的字段名称?
答案 0 :(得分:5)
首先,在任何事情之前,备份表:
mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql
执行ALTER命令时要记住的一件事是绝对确保您拥有相同的列详细信息,以便您不想更改。
例如:
ALTER TABLE big_table MODIFY COLUMN id INT(11)
会跳过其他任何内容,例如AUTO_INCREMENT
和NOT 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)
您可以执行以下操作:
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;
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)
您如何看待:
这只是一个快速的想法,但它不会很快(导出/导入)。
或者只是尝试在晚上几小时维护期间进行更换? :)