为什么MOD​​IFY AUTO_INCREMENT需要重建表?

时间:2017-11-21 00:29:05

标签: mysql auto-increment alter-table

我们已经加载了几个表(每个数亿行),但是下面的查询需要重写整个表(除了AUTO_INCREMENT之外,类型完全相同):

ALTER TABLE sales MODIFY id BIGINT(20) NOT NULL AUTO_INCREMENT;

这只是MySQL的一个巨大疏忽,还是从根本上改变了磁盘上数据的格式?

1 个答案:

答案 0 :(得分:1)

更改列的AUTO_INCREMENT特性不能作为在线DDL更改。即使我试图明确要求它:

mysql> alter table sales modify column id bigint not null auto_increment, 
  ALGORITHM=INPLACE;

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. 
Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

这种更改列定义的情况似乎计为列类型的更改(基于错误消息)。

https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html#innodb-online-ddl-summary-grid说:

  

更改列数据类型...仅支持ALGORITHM = COPY

在MySQL 5.7中,重建表仍然需要更改列的类型,除了一种情况:增加VARCHAR长度是允许的INPLACE更改。

您并不是唯一一个认为应该允许在不进行表重组的情况下更改AUTO_INCREMENT属性的人:https://bugs.mysql.com/bug.php?id=72109