1

我的表 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 ...;
4

0 回答 0