我的表 t1 有一个 int auto_increment PK (id),其值从 1 到大约 40k。
CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`col1` int NOT NULL,
`col2` int NOT NULL,
...
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40124 DEFAULT CHARSET=latin1
一些清除和重置表中数据的代码如下:
TRUNCATE TABLE t1;
INSERT INTO t1 (col1, col2, ...)
SELECT ... FROM t2 WHERE ... ORDER BY ...;
以这种方式插入的行数通常在 40k 到 41k 之间。
t1.id
未插入到 select-insert 中。
运行时
show create table t1;
它为 65536 的 id 显示了一个新的 auto_increment 值:
...
) ENGINE=InnoDB AUTO_INCREMENT=65536 DEFAULT CHARSET=latin1
但是,id 的值仍然是从 1 到 40123 或任何由 select-insert 产生的行数。
但是一个新的插入将 id 设置为 65536。
> select * from t1 order by id desc limit 10;
+-------+---------------+---------------+---
| id | col1 | col2 |...
+-------+---------------+---------------+---
| 65536 | 12345 | 123456 |...
| 40123 | 73627 | 736273 |...
| 40122 | 45678 | 456789 |...
mysql 是否预计由于 40k 是 Select-Insert 的近似结果集大小,它应该使用最接近的上里程碑大小 65536 ?
或者是否有必要在 TRUNCATE 之后放置一个明确的声明?
TRUNCATE TABLE t1;
ALTER TABLE t1 SET AUTO_INCREMENT=1;
INSERT INTO t1 (col1, col2, ...)
SELECT ... FROM t2 WHERE ... ORDER BY ...;