この動作は、「バルクインサート」
およびinnodb_autoinc_lock_mode
設定。
私が理解している限り(これについてはドキュメントが明確ではありません)、INSERT INTO ... SELECT
を使用すると ステートメント、MySQLはクエリを実行する前に実際に挿入されている行数を知ることはできませんが、innodb_autoinc_lock_mode=1
を使用する場合は、新しいAUTO_INCREMENT値のIDを予約する必要があります。 (連続)または2
(インターリーブ)。私の観察から、カウントが2の累乗であるAUTO_INCREMENT番号のセットを予約します(これを確認することはできず、推測のみです)。次の例を参照してください:
CREATE TABLE sourceTable(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE targetTable(
id INT AUTO_INCREMENT PRIMARY KEY,
original VARCHAR(30)
);
INSERT INTO sourceTable(name) VALUES ('one');
INSERT INTO sourceTable(name) VALUES ('two');
INSERT INTO sourceTable(name) VALUES ('three');
INSERT INTO sourceTable(name) VALUES ('four');
INSERT INTO sourceTable(name) VALUES ('five');
INSERT INTO targetTable(original) SELECT name FROM sourceTable;
INSERT INTO targetTable(original) VALUES ('manual');
SELECT * FROM targetTable;
これにより、次の出力が生成されます。
+----+----------+
| id | original |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 8 | manual |
+----+----------+
ソーステーブルから5行を挿入すると、次の8つの可能なAUTO_INCREMENT値が予約されます。これは、5より大きい2の数値の最も近い累乗であるためです。ただし、5行しか挿入しないため、5行のみが使用されます。
>あなたの場合、200行を挿入しているので、200より大きい2の最も近い累乗は256になります。したがって、56の欠落しているAUTO_INCREMENT値の「ギャップ」があり、次のエントリはID256を取得します。