web-dev-qa-db-ja.com

MySQL-挿入エラーを無視:エントリが重複しています

私はPHPで働いています。

一意のフィールドを持つDBに新しいレコードを挿入する適切な方法を教えてください。バッチで大量のレコードを挿入していますが、新しいレコードを挿入したいだけで、重複したエントリのエラーは必要ありません。

最初にSELECTを作成し、INSERTの前にエントリがすでに存在するかどうかを確認し、SELECTがレコードを返さない場合にのみ挿入する方法はありますか?しないことを願っています。

エラーなしでこれらの挿入を無視するようにMySQLに何らかの形で伝えたいと思います。

ありがとうございました

72
neon

重複するレコードがある場合にアクションを実行しない場合は、 INSERT ... IGNORE 構文を使用できます。

古いレコードを同じキーを持つ新しいレコードで上書きする場合は、 REPLACE INTO 構文を使用できます。

または、重複が発生したときにレコードの更新を実行する場合は、 INSERT ... ON DUPLICATE KEY UPDATE 構文を使用できます。

編集:いくつかの例を追加すると思いました。

tblidの2つの列を持つvalueという名前のテーブルがあるとします。 1つのエントリ、id = 1およびvalue = 1があります。次のステートメントを実行する場合:

REPLACE INTO tbl VALUES(1,50);

Id = 1 value = 50のレコードがまだ1つあります。ただし、最初にレコード全体が削除されてから再挿入されたことに注意してください。次に:

INSERT IGNORE INTO tbl VALUES (1,10);

操作は正常に実行されますが、何も挿入されません。まだid = 1とvalue = 50があります。最後に:

INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;

これで、id = 1およびvalue = 200の単一のレコードができました。

157
zombat