假设我有一张桌子
CREATE TABLE `tab_sample` (
  `id` bigint(20) NOT NULL,
  `something` char(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;我想把它变成
CREATE TABLE `tab_sample` (
  `id` bigint(20) NOT NULL,
  `something` char(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;但
ALTER TABLE `tab_sample` MODIFY
  id bigint(20) NOT NULL AUTO_INCREMENT;如果表很大,则要花费很长时间,因为出于某种原因,MYSQL决定重写整个过程(首先复制到临时表,.)。
有更好的方法吗?最后,这实际上应该更改id默认值的规则,不是吗?
发布于 2019-01-12 21:01:10
您希望更改是元数据,但不会是元数据。
您可以通过请求将alter作为内部更改进行测试,并在请求无法满足时看到错误。
mysql> alter table tab_sample modify 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.InnoDB有一个有限的ALTER类型子集,可以作为内部或元数据进行更改。请参阅https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html
您请求的alter可能算作“更改列数据类型”,即使您不是要更改类型,而是只更改AUTO_INCREMENT选项。
我认为当您的MySQL列包含NULL或0时,id必须为边缘情况执行表复制。在这种情况下,MySQL将生成一个新的自动增量值,并替换NULL或0。
mysql> insert into tab_sample (id) values (10),(20),(30),(0)
mysql> ALTER TABLE `tab_sample` MODIFY   id bigint(20) NOT NULL AUTO_INCREMENT;
Query OK, 4 rows affected (0.06 sec)
mysql> select * from tab_sample;
+----+-----------+
| id | something |
+----+-----------+
|  1 | NULL      |
| 10 | NULL      |
| 20 | NULL      |
| 30 | NULL      |
+----+-----------+看到我的0被自动增量改为1。
其他边缘情况:该列可能不是唯一的键,因此它可能包含了许多0或NULL的行,它们都将被赋予新的id。
mysql> create table tab_sample2 ( id bigint, key(id));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into tab_sample2 values (10),(20),(30),(0),(0),(0),(NULL),(NULL),(NULL);
Query OK, 9 rows affected (0.02 sec)
Records: 9  Duplicates: 0  Warnings: 0
mysql> alter table tab_sample2 modify column id bigint auto_increment;
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0
mysql> select * from tab_sample2;
+----+
| id |
+----+
| 10 |
| 20 |
| 30 |
| 31 |
| 32 |
| 33 |
| 34 |
| 35 |
| 36 |
+----+MySQL不知道表中有多少行需要新的id值。可能是桌子上的每一排。因此,为了安全起见,它只需复制一个表,并根据需要在多行上填写auto的值。
https://stackoverflow.com/questions/54163679
复制相似问题