挿入…重複キー(何もしない)


184

2つの列に一意のキーを持つテーブルがあります。

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

そのテーブルに行を挿入したいのですが、キーが存在する場合は何もしません。キーが存在するため、エラーを生成したくありません。

次の構文があることを知っています。

INSERT ... ON DUPLICATE KEY UPDATE ...

しかし、次のようなものがあります:

INSERT ... ON DUPLICATE KEY DO NOTHING 

回答:


332

はい、使用しますINSERT ... ON DUPLICATE KEY UPDATE id=id(それid自体に割り当てられている場合でも、行の更新はトリガーされません)。

エラー(変換エラー、外部キーエラー)と自動インクリメントフィールドの枯渇(重複キーのために行が挿入されない場合でもインクリメントされます)を気にしない場合は、を使用しますINSERT IGNORE


5
INSERTの後にIGNOREを追加するだけで、残りの構文は同じですか?
ufk

25
@ufk:一部INSERT IGNOREなしON DUPLICATE KEY、例INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
INSERT IGNOREは、データ変換の失敗などの他のエラーも無視することに注意してください。
mjcopple 2011年

36
そのため、ON DUPLICATE KEY UPDATE id = idを使用します。他の種類のエラーではなく、キーの重複を無視したいだけです。
ufk

7
行が挿入されていなくてもINSERT IGNOREが自動インクリメント列をインクリメントすることに注意してください
WorM

9

「存在しない場合は挿入」を実装する方法?

1。 REPLACE INTO

長所:

  1. シンプル。

短所:

  1. 遅すぎる。

  2. 自動インクリメントキーがしますCHANGEエントリの一致がある場合に(1ずつ増加)unique keyまたはprimary key、それは新しいものを挿入し、古いエントリが削除されるため。

2。 INSERT IGNORE

長所:

  1. シンプル。

短所:

  1. エントリが一致するunique key場合primary key、自動インクリメントキーは変更されませんが、自動インクリメントインデックスは1ずつ増加します

  2. データ変換エラーなど、他のいくつかのエラー/警告は無視されます。

3。 INSERT ... ON DUPLICATE KEY UPDATE

長所:

  1. これで「保存または更新」機能を簡単に実装できます

短所:

  1. 更新ではなく挿入したいだけの場合は、比較的複雑に見えます。

  2. エントリが一致するunique key場合primary key、自動インクリメントキーは変更されませんが、自動インクリメントインデックスは1ずつ増加します

4.エントリが一致する場合に自動インクリメントキーの増加を停止する方法、unique keyまたはprimary key

以下のコメントで@toienが述べているように、エンジンとしてinnodb_autoinc_lock_mode使用innodbしている場合、「自動インクリメントカラムはバージョン5.1以降の設定に依存して影響を受けます」が、並行性にも影響するため、使用前に十分に検討する必要があります。これまでのところ、これ以上の解決策はありません。


自動インクリメント列はinnodb_autoinc_lock_mode、バージョン5.1以降の構成に応じて影響を受けます
toien

1

使用ON DUPLICATE KEY UPDATE ...
否定:UPDATEは2番目のアクションにリソースを使用するため。

使用するとINSERT IGNORE ...
負:何かがうまくいかない場合は、エラーを処理することはできませんので、MySQLは、すべてのエラーを表示されません。クエリを気にしない場合にのみ使用してください。


@abdul mysqlのサポートはありますか?
Lalit Tarsariya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.