気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

MySQL 重複レコードを無視する

INSERT IGNOREとは?

  • INSERT句に付与可能な修飾子
  • レコード登録時に無視可能なエラーが発生した場合に無視してレコード登録できる

INSERT ステートメントの実行中に発生する無視可能なエラーは無視されます

無視されるエラー一覧

ER_BAD_NULL_ERROR
ER_DUP_ENTRY
ER_DUP_ENTRY_WITH_KEY_NAME
ER_DUP_KEY
ER_NO_PARTITION_FOR_GIVEN_VALUE
ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
ER_NO_REFERENCED_ROW_2
ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET
ER_ROW_IS_REFERENCED_2
ER_SUBQUERY_NO_1_ROW
ER_VIEW_CHECK_FAILED

INSERT IGNOREのクエリ

SELECT * FROM sample_table;
+----+
| ID |
+----+
|  1 |
|  2 |
+----+


INSERT IGNORE INTO sample_table (member_id)
    -> VALUES (1),
    -> (3)
Query OK, 1 row affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 1  Warnings: 1

-- 重複したKeyのレコードは無視され、重複なしのレコードがINSERTされている
SELECT * FROM sample_table;
+----+
| ID |
+----+
|  1 |
|  2 |
|  3 |
+----+

ただし、NOT NULL制約にしている項目でもレコードが作成されてしまう懸念があり、 INSERT IGNOREは基本使わないほうが良いとのこと。

参考URL

【MySQL】重複レコードを避けたいときにINSERT IGNOREを使うのはあぶない #MySQL - Qiita