重複するデータが無い時のみ挿入する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' )