MySQL にデータを挿入するとき、挿入されたデータがテーブルにすでに存在する (主キーまたは一意のキーがすでに存在する) 場合は、挿入無視構文を使用して重複データの挿入を無視します。
1.挿入無視構文
insert ignore into table_name values…
挿入無視構文を使用してデータを挿入するときに、主キーまたは一意キーの競合が発生すると、挿入されたデータは無視されます。
次のいずれかの条件を満たします。
重複する主キー
重複する一意のキー
2. 大文字と小文字を無視して挿入する
まずテーブル、table_name、主キー ID、一意のキー名を確認します。具体的なテーブル構造とテーブル内のデータは次のとおりです。
CREATE TABLE table_name(
id int(11) NOT NULL,
name varchar(50) DEFAULT NULL,
age int(11) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> select * from table_name;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Tom | 20 |
+----+------+------+
2.1 主キーの競合
ID 1 のレコードを挿入します。ignore が追加されていない場合は、次のように主キーの競合エラーが報告されます。
mysql> insert into table_name values(1,’Bill’, 21);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’
無視を追加すると、エラーは報告されませんが、次のような警告が表示されます。
mysql> insert ignore into table_name values(1,’Bill’, 21);
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+———+——+—————————————+
| Level | Code | Message |
+———+——+—————————————+
| Warning | 1062 | Duplicate entry ‘1’ for key ‘PRIMARY’ |
+———+——+—————————————+
テーブルをクエリすると、挿入されたデータが無視されたことがわかります。
mysql> select * from table_name;
+—-+——+——+
| id | name | age |
+—-+——+——+
| 1 | Tom | 20 |
+—-+——+——+
2.2 一意のキーの競合
同様に、以下に示すように、一意のキーが競合するデータの挿入も無視されます。
mysql> insert into table_name values(2,’Tom’,21);
ERROR 1062 (23000): Duplicate entry ‘Tom’ for key ‘uk_name’
mysql> insert ignore into table_name values(2,’Tom’,21);
Query OK, 0 rows affected, 1 warning (0.00 sec)
ビジネス ロジックが重複データの挿入時に自動的に無視する必要がある場合は、MySQL の挿入無視機能を試してみるとよいでしょう。