重複するデータが無い時のみ挿入するSQLinsert ignore into ...と Auto-Increment に空番ができてしまう原因について説明します。
また 一定の条件を満たすレコードが存在しないときに挿入するSQLinsert ... where not exist と エラーDuplicate column ...の解消方法をご紹介します。
重複させたくないカラムにユニークキーなどを指定するだけで簡単に利用できます。
ignore into はエラーを無視するだけです。
insert ignore into `テーブル名` (`カラムA`, `カラムB`) values ('データA', 'データB');
上記のコードを実行すると プライマリーキーやユニークキーに設定されているカラムが重複している場合、挿入が行われません。
逆に カラムがプライマリーキーなどに設定されていないと そのまま挿入されます。
ignore into はエラーを無視しているだけなので 挿入の試行は行っています。
そのため 挿入されなくても AIは消費されてしまいます。
これが嫌なら insert ... where not existの利用をお勧めします。
好きな条件を指定できるので insert ignore into より 拡張性が高い。
今回は カラムAの最大値が更新された時のみ 挿入する条件で SQLを書いてみました。
insert into `テーブル名` (`カラムA`, `カラムB`)
select * from (select 'データA', 'データB') as tmp
where not exist ( select * from `テーブル名` where `カラムA` >= 'データA' )
エーリアスを与えるだけで解消します。
insert into `テーブル名` (`カラムA`, `カラムB`)
select * from (select 'データA' as `A`, 'データB' as `B`) as tmp
where not exist ( select * from `テーブル名` where `カラムA` >= 'データA' )