2011-08-01 11 views
8

私の質問に対する答えは明白ですが、サポートするドキュメントが見つからないので、質問する価値はあると思いました。少なくとも記録のために。複数行の挿入でMySQLのAUTO_INCREMENT動作が発生する

ステートメントが実行されるたびにAUTO_INCREMENTフィールドが増分されます。そしてその値はLAST_INSERT_ID()機能によって取り出すことができます。また、MySQL's Manualには、複数行の挿入でLAST_INSERT_ID()が挿入された行の最初のIDを返すことが記載されています。それは良いアイデアだと思う(本当に便利です)。だからここ

は私の質問を行く:

は、私は、複数の行とINSERT IGNORE INTO文で想定することができ、AUTO_INCREMENTフィールドの挿入IDは常に連続しているのでしょうか? IGNORE修飾子とMySQLサーバーのマルチユーザーの性質により、さまざまなシナリオが発生する可能性があることに注意してください。

ありがとうございました。

答えて

6

あなたはそれを想定できません。 IDがシーケンシャルでないシナリオの1つは、レプリケートされたマルチマスターセットアップです。たとえば、このような設定で2台のサーバーが存在する場合、自動IDだけが生成され、その他のIDは奇数IDだけが生成されます(単なる例です)。

あなたの設定がそうでない場合は、はい。少なくともInnoDBのインサートはアトミックであり、同じテーブルをターゲットにするとキューに入れられるため、2つの異なる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) 
+0

方法IGNORE'修飾子 'について:私はINSERT IDの生成をIGNOREテスト方法


(それに頼ることはある...少し危険な、しかし文書化されていませんです)挿入されていてもカウンターを進める?私はこれを尋ねました。なぜなら、 'IGNORE'修飾子のない単一行の' INSERT'文では、行が挿入されていなくても何らかのエラーが発生したときにカウンタがインクリメントされています。 – Mehran

+1

Mehran Ziadloo:私はちょうど確かめるためにチェックをした、そしてIDは連続していた。 – Mchl

+0

私の悪い点は、 'IGNORE'修飾子を使うとカウンタが増加しないということです。それは_duplicate key_エラーが警告に変わる行です。 – Mehran

関連する問題