1

テーブル 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.idselect-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