【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文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。