10

私の質問に対する答えは明らかだと思いますが、それをサポートするドキュメントが見つからなかったので、尋ねる価値があると思いました。少なくとも記録のために。

ご存知のとおり、フィールドはステートメントが実行されるAUTO_INCREMENTたびにインクリメントされます。INSERTそして、その値はLAST_INSERT_ID()関数によって取得できます。MySQLのマニュアルには、複数行の挿入でLAST_INSERT_ID()は、挿入された行の最初のIDが返されることも記載されています。これは良い考えだと思います(本当に便利です)。

だからここに私の質問があります:

INSERT IGNORE INTO複数行のステートメントで、挿入されたAUTO_INCREMENTフィールドのIDは常にシーケンシャルであると想定できますか?IGNOREMySQLサーバーの修飾子とマルチユーザーの性質により、さまざまなシナリオが発生する可能性があることに注意してください。

ありがとう。

4

1 に答える 1

10

いいえ、それを想定することはできません。ID が連続しないシナリオの 1 つは、レプリケートされたマルチマスター セットアップです。たとえば、このような設定で 2 つのサーバーが存在する場合、一方は偶数の自動 ID のみを生成し、もう一方は奇数の ID のみを生成します (これは単なる例であることに注意してください)。

ただし、セットアップがそのようなものでない場合は、はい。少なくとも InnoDB では、挿入はアトミックであり、同じテーブルを対象とする場合はキューに入れられるため、2 つの異なる INSERT からの ID はインターレースしません。(ただし、文書化されていないため、それに依存するのは...少し危険です)


IGNORE INSERT ID 生成のテスト方法:

mysql> CREATE TABLE  `ignoreinsert` (
    ->   `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `uq` int(10) unsigned NOT NULL,
    ->   PRIMARY KEY (`ID`),
    ->   UNIQUE KEY `uq` (`uq`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.19 sec)

mysql> INSERT INTO ignoreinsert VALUES (null,1),(null,2);
Query OK, 2 rows affected (0.10 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
+----+----+
2 rows in set (0.00 sec)

mysql> INSERT IGNORE INTO ignoreinsert VALUES (null,3),(null,1),(null,4),(null,2),(null,5);
Query OK, 3 rows affected (0.08 sec)
Records: 5  Duplicates: 2  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
|  4 |  4 |
|  5 |  5 |
+----+----+
5 rows in set (0.00 sec)
于 2011-08-01T08:35:04.627 に答える