存在しない場合のみデータを挿入


最近、プロジェクトを書いていますが、データベースに大量にデータを挿入する必要があります(バッチ).ただし、データが既に存在する(プライマリ・キーが同じ)場合、すべての挿入に失敗するという問題があります.データが存在しない場合は挿入し、そうでない場合は無視する方法を見つける必要があります.
ネット上で記事を見つけました.
mysqlデータベースにレコードを追加すると、テーブルに存在しないときに挿入され、存在するときに無視されることがよくあります(1).存在する場合は更新し、存在しない場合は挿入する(2).(1)について、ネットで探してみると、ほとんどの文がこうでした:insert into...select ...not exists... 例えば、insert into tb(field 1,field 2)select'aa','bb'from tb where not exists(select*from tb where field 1='aa');私のマシンでは、テストを始めたばかりの頃は問題は見つかりませんでしたが、テーブルをクリアした後、この文は何も挿入できません(空のテーブルの場合、何の記録も挿入できません).このとき、select'aa','bb'from tb where not exists(select*from tb where field 1='aa')は常に空を返します.表が空の場合、select'aa','bb'from tb where not exists(select*from tb where field 1='aa')は常に空です.テーブルにレコードがありますが、フィールドfield 1の値が「aa」のレコードがない場合、「aa」、「bb」を返しますか?資料を調べたが,まだ原因が確定していない.迂回して、この問題に対して一時表を用いて解決し、sqlは以下の通りである:insert into tb(field 1,field 2)select*from(select'aa','bb')as t where(select count(*)from tb where field 1='aa')=0;一般実装(2)は、表に基づいてプライマリ・キー制約を行う方式で、「ON DUPLICATE KEY UPDATE」コマンドを使用します.例として、idがプライマリ・キーであり、記録されたidが存在する場合は累積フィールドdealcountの値を更新し、存在しない場合は挿入します.
本文は2つの方法を紹介した.1つ目はやや複雑で、サブクエリの効率も問題であり、サブクエリではlimitを使用できない(もちろん解決方法もある).2つ目は、更新ではなく無視する必要があるので、あまり適切ではありません.
Mysql INSERTの文法を調べてみると、
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    

       [INTO] tbl_name [(col_name,...)]
    
       VALUES ({expr | DEFAULT},...),(...),...
    

       [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

ネット上ではあまり言及されていない「insert ignore into」という書き方が発見されました.この書き方は非常に簡潔で、私の要求に完全に合っています.
本文は“木又寸の技術のブログ”のブログから出て、転載して作者と連絡してください!