有没有办法将以下内容添加为一个语句而不是两个?以下每个语句都需要几个小时才能运行,因此我想知道在创建时它是否可以编入索引?
alter table main_table add `last_updated` datetime DEFAULT CURRENT_TIMESTAMP;
alter table main_table add index (last_updated);
答案 0 :(得分:2)
根据manual,ALTER TABLE语法的相关部分是:
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
alter_specification:
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option] ...
表示您可以在同一语句中同时添加列和索引。
我已经测试了这个(在MySQL 5.6上),它运行良好:
alter table main_table add `last_updated` datetime DEFAULT CURRENT_TIMESTAMP,
add index (last_updated);
答案 1 :(得分:2)
您没有指定MySQL服务器版本或表引擎,但如果您使用最新版本的MySQL(> 5.6)在InnoDB上,您是否考虑使用显式Online DDL?
ALTER TABLE main_table
ADD `last_updated` DATETIME DEFAULT CURRENT_TIMESTAMP,
ADD INDEX (`last_updated`),
ALGORITHM=inplace,
LOCK=none;
请注意,可以使用就地算法时有some constraints。
如果您有外键约束,将使用disable those或复制算法。而且它会很慢。
如果您的表是在5.6之前创建的,那么您需要使用复制算法rebuild the table才能切换到就地算法。
最后,如果您使用5.6之前的版本或因任何原因无法使用这些内容,请考虑使用Percona's online-schema-change。