mysql で重複するレコードを登録しない方法のメモ。
以下のようにテーブルを作成し、エラーにならないように重複するレコードを登録する insert 文を実行します。
■DB登録内容
■レコード登録
insert ignore into ~ でレコードを登録します。
■DB登録内容確認
id が name1、name2 分だけインクリメントされています。
次に、テーブルを作り直して、insert ~ where not exists ~ でレコードを登録します。
■レコード登録
■DB登録内容確認
重複レコードで id がインクリメントされずに、連番になっていることがわかります。
以下のようにテーブルを作成し、エラーにならないように重複するレコードを登録する insert 文を実行します。
create table test1 ( id integer not null auto_increment, name varchar(100) not null, primary key (id), unique key (name) ); insert into test1 set name = 'name1'; insert into test1 set name = 'name2'; insert into test1 set name = 'name3';
■DB登録内容
mysql> select * from test1; +----+-------+ | id | name | +----+-------+ | 1 | name1 | | 2 | name2 | | 3 | name3 | +----+-------+
■レコード登録
insert ignore into ~ でレコードを登録します。
insert ignore into test1 set name = 'name1'; insert ignore into test1 set name = 'name2'; insert ignore into test1 set name = 'name4';
■DB登録内容確認
mysql> select * from test1; +----+-------+ | id | name | +----+-------+ | 1 | name1 | | 2 | name2 | | 3 | name3 | | 6 | name4 | +----+-------+
id が name1、name2 分だけインクリメントされています。
次に、テーブルを作り直して、insert ~ where not exists ~ でレコードを登録します。
■レコード登録
insert into test1 (name) select * from (select 'name1') as tmp where not exists (select 1 from test1 where name = 'name1'); insert into test1 (name) select * from (select 'name2') as tmp where not exists (select 1 from test1 where name = 'name2'); insert into test1 (name) select * from (select 'name5') as tmp where not exists (select 1 from test1 where name = 'name5');
■DB登録内容確認
mysql> select * from test1; +----+-------+ | id | name | +----+-------+ | 1 | name1 | | 2 | name2 | | 3 | name3 | | 4 | name5 | +----+-------+
重複レコードで id がインクリメントされずに、連番になっていることがわかります。