【SQL】レコードが存在しない場合だけINSERTする方法

このページでは、ORACLEデータベースのSQLで、条件に一致するレコードが存在しない場合だけ、INSERTする方法を紹介します。

条件に一致するレコードが存在しない場合だけINSERTする方法はいくつかあるので順々に紹介していきます。

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

レコードが存在しない場合だけINSERTする方法

NOT EXISTSを使ってINSERTする方法

条件に一致しない場合によく使うのがNOT EXISTSです。

例えば、TAB2テーブルから、TAB1テーブルにデータを登録するときです。

TAB1テーブルに存在しないデータだけを登録したい場合には、NOT EXISTSを使います。

INSERT INTO tab1(col1,col2)
SELECT
  a.col1
  ,a.col2
FROM
  tab2 a
WHERE
  NOT EXISTS (SELECT
                 'x'
              FROM
                 tab1 b
              WHERE
                 a.col1 = b.col1);

MINUS演算子を使ってINSERTする 方法

MINUS演算子を使うことで、SELECT結果とSELECT結果の差分を取得することが出来ます。

例えば、Aというテーブルには存在して、Bというテーブルには存在しないデータを抽出することが出来ます。

次のサンプルでは、TAB1テーブルにレコードを登録しています。

TAB2テーブルのSELECT結果から、TAB3テーブルのSELECT結果の差分を取得しています。

つまり登録するデータは、TAB2テーブルに存在するが、TAB3テーブルには存在しないデータになります。

INSERT INTO tab1(col1,col2)
SELECT col1,col2 FROM tab2
MINUS
SELECT col1,col2 FROM tab3;

既に存在するレコードをINSERTした場合

もし誤って主キー項目が一致するレコード、つまり重複レコードのINSERTを行った場合には、SQLエラーになります。

例えば、100万件INSERTする1本のSQLを実行していて、1件でも重複レコードがあると全てエラーになります。

100本のINSERT文をエディタで実行していると、途中でエラーになっても、そのまま後ろのSQLが実行されたりもするので注意が必要です。

まとめ

INSERT文で、レコードが存在しない場合だけINSERTする方法はNOTEXISTSやMINUSを使うことでコーディングすることが出来ます。

このほか、INSERT文には様々な書き方があります。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。