【SQL】INSERT文で重複を無視・チェック・回避する方法


このページでは、ORACLEデータベースのSQLで、INSERT文で重複行があった場合に無視、チェック、回避する方法を紹介します。

INSERT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり

INSERT文で重複を無視する方法

ORACLEデータベースでは、INSERTで重複行が発生した場合、SQLエラーとなります。つまり無視できません。

アプリケーション内部やシステムの中で実行されるSQLの場合だと重複行があるとSQLエラー→システムエラーと言う形になります。

無作為に重複を許さない強固な仕組みとも言えます。

ただし、手作業でSQLを実行する場合は無視することもできます。

例えば、100件のINSERT文を実行中に20件目で重複エラーとなったとしても、21件目以降のSQLが実行されると思います。

SQLを実行するエディタにもよりますが、無視するエディタもあります。確かosqleditは無視すると思います。

INSERTの重複を事前にチェックする方法

重複する行が存在するか存在しないか、事前にチェックする方法です。

これは非常に簡単で、キー項目でSELECTすることです。

次のSQLのように、INSERTする前に、INSERTしようとしているキー項目で、テーブルにSELECTしてデータが存在するかどうかチェックします。

SELECT 'x' FROM tab1 WHERE col1 = '001';

フレームワークが利用されている環境があれば、存在チェックをするプログラムやメソッドも容易されています。

一度にたくさんのレコードの存在チェックを行いたい場合は次のSQLを参考にしてください。

キー項目をIN句で条件指定して、検索することが出来ます。

SELECT
    col1
    ,col2
    ,col3
FROM
     tab2
WHERE 
    (col1,col2,col3) in (('a001','a002','a003')
                         ,('b001','b002','b003')
                         ,('c001','c002','c003'));

INSERTで重複を回避する方法

INSERTで重複を回避する方法は2種類あります。

1.重複行を避ける条件をつけてINSERTする
 まず1つは重複行を避ける条件をつけてINSERTする方法です。これについては、「【SQL】レコードが存在しない場合だけINSERTする方法」で詳しく解説しているので参考にしてください。

2.重複行が発生した後のエラーハンドリングを行う
 INSERTで重複行が発生すると、SQLエラーとなります。
 アプリケーションなどでは、この時のエラーハンドリングが重要です。

 例えば、一旦トランザクションを全てロールバックさせてエラーを通知することや、数十秒後にプログラムをリトライさせるといったエラーハンドリンを行い、重複を回避していきます。

まとめ

アプリケーションやプログラムの設計やコーディングにおいて、レコードの兆風苦発生に対する考え方は非常に重要です。

システムの設計ルールやフレームワークの機能として存在することも多いので十分確認しましょう。

当サイトでは、他にもINSERT文の書き方や使い方を紹介しています。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。