テーブル t1 には、1 から約 40k までの値を持つ int auto_increment PK (id) があります。
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 ...;