我想实现以下命令,使用以下命令将列添加到现有表中:
ALTER TABLE foo ADD COLUMN bar AFTER COLUMN old_column;
如果没有AFTER COLUMN选项,此选项是否比相同的命令长得多,如下所示?
ALTER TABLE foo ADD COLUMN bar;
第一个命令会在执行期间使用更大量的tmp表空间来执行操作吗?
上下文:我有一个非常大的表(想想超过十亿行),我想使用AFTER COLUMN选项添加一个额外的列,但我不想受到太多的惩罚。
答案 0 :(得分:35)
这就是我要做的事情:
CREATE TABLE newtable LIKE oldtable;
ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NOT NULL DEFAULT 0;
我不知道你的专栏类型。我举一个INT的例子。现在,您可以在此处指定要添加此新列的位置。默认情况下,除非您指定AFTER关键字,否则它会在末尾添加它,如果您提供它,则必须按顺序指定,否则您需要将其放在最后。
INSERT INTO newtable SELECT field1, field2, field3 /*etc...*/, newcolumn = 0 FROM oldtable;
或者,如果您在列之间添加它:
# eg: ALTER TABLE newtable ADD COLUMN columnname INT(10) UNSIGNED NULL AFTER field2;
INSERT INTO newtable SELECT field1, field2, newcolumn = 0, field3 /*etc...*/ FROM oldtable;
如果要批量执行,可以添加where子句。
一旦所有记录都在那里
DROP TABLE oldtable;
RENAME TABLE newtable to oldtable;
答案 1 :(得分:11)
创建另一个表并更改新表。 (就像Book of Zeus所做的那样)
在插入查询之前和之后使用ALTER TABLE newtable DISABLE KEYS
和ALTER TABLE newtable ENABLE KEYS
可以加快速度。 (如下所示)
CREATE TABLE newtable ....;
ALTER TABLE newtable ....;
ALTER TABLE newtable DISABLE KEYS;
INSERT INTO newtable ....;
ALTER TABLE newtable ENABLE KEYS;
DROP TABLE oldtable;
答案 2 :(得分:5)