一定条件を満たす時のみ挿入を行う2つのSQL(ignore, wehre not exist) と注意点

公開日:2018/04/15  最終更新日:2018/05/02  カテゴリー:MySQL

重複するデータが無い時のみ挿入するSQLinsert ignore into ...と Auto-Increment に空番ができてしまう原因について説明します。
また 一定の条件を満たすレコードが存在しないときに挿入するSQLinsert ... where not exist と エラーDuplicate column ...の解消方法をご紹介します。

1. 重複データが無い時のみ挿入する insert ignore into...

1.1. 使い方

重複させたくないカラムにユニークキーなどを指定するだけで簡単に利用できます。
ignore into はエラーを無視するだけです。

insert ignore into `テーブル名` (`カラムA`, `カラムB`) values ('データA', 'データB');

上記のコードを実行すると プライマリーキーやユニークキーに設定されているカラムが重複している場合、挿入が行われません。
逆に カラムがプライマリーキーなどに設定されていないと そのまま挿入されます。

1.2. Auto-Increment に空番ができてしまう問題と解消方法

ignore into はエラーを無視しているだけなので 挿入の試行は行っています。
そのため 挿入されなくても AIは消費されてしまいます。
これが嫌なら insert ... where not existの利用をお勧めします。

2. 特定条件下のみ挿入する insert ... where not exist

2.1. 使い方

好きな条件を指定できるので insert ignore into より 拡張性が高い。
今回は カラムAの最大値が更新された時のみ 挿入する条件で SQLを書いてみました。

insert into `テーブル名` (`カラムA`, `カラムB`) 
select * from (select 'データA', 'データB') as tmp 
where not exist ( select * from `テーブル名` where `カラムA` >= 'データA' )
このSQLには 2.2 で 紹介する問題があります。
2.2 の問題が無い SQLの使用をお勧めします。

2.2. 同じ値を含むレコードを挿入できない問題と解消方法

エーリアスを与えるだけで解消します。

insert into `テーブル名` (`カラムA`, `カラムB`) 
select * from (select 'データA' as `A`, 'データB' as `B`) as tmp 
where not exist ( select * from `テーブル名` where `カラムA` >= 'データA' )

参考文献

本サイトでは URLに日本語を含んでいます。
メールなどで共有する場合は リンクとして認識されない場合がございますので、こちらをご利用ください。