複数レコードのINSERT

  • あるテーブルに複数レコードをINSERTしなければいけないことがたまにあります。レコードの件数分ループして、平たいINSERT文を発行するのも一つの手段です。
  • しかしループしてSQL発行していると、コストも高く、何とかしてあげたくなります。
  • そこで、今回は複数レコードを1本のSQLにして発行するようにしたいと思いました。
  • DBMSは手元にあったOracle 10g expressです。

サンプルテーブル準備

CREATE TABLE shouhin
( shouhin_code INT
, shouhin_name VARCHAR(100)
, shouhin_bunrui_code INT
);
CREATE TABLE shouhin_bunrui
( shouhin_bunrui_code INT
, shouhin_bunrui_name VARCHAR(100)
);
INSERT INTO shouhin VALUES (1,'ボールペン黒',10);
INSERT INTO shouhin VALUES (2,'ボールペン赤',10);
INSERT INTO shouhin VALUES (3,'ノート無地',20);
INSERT INTO shouhin_bunrui VALUES (10,'ペン');
INSERT INTO shouhin_bunrui VALUES (30,'用紙');

確認

Hukusu insert.png

通常のinsert

Hukusu insert1.png


  • レコードが1件登録されました。
  • 1件のみのinsertであれば良いですが、複数のレコードをinsertする場合はこれを繰り返すことになります。

まとめてinsert

Hukusu insert2.png


  • ためしに2レコードのinsertを行いました。
  • 「select * from dual」が?だったのですが、これはselectした内容をinsertデータとして使用するための様です。selectの内容が必要ない場合は、とりあえずdualで対応?(文法的に必須みたい)
  • selectの内容を使用する場合は、以下のようになります。

Hukusu insert3.png


  • この様なinsert文を、oracleでは「マルチテーブル・インサート」と呼ぶそうです。
  • マルチテーブルなので、1本のSQLで複数のテーブルにinsertすることも可能です。

その他のDBMS

MYSQL

Hukusu insert4.png

  • MYSQLの場合は、同じ様に複数のデータを一度にinsertすることができます。

Hukusu insert5.png


SQLServer

  • SQLServer2008から以下のように一度にinsertすることが出来るようです。(未確認)
Insert Into テーブル名(項目名1,項目名2) Values (1,a),(2,b)
  • ただ一度にinsert出来るレコード数に制限があり、デフォルトでは1000行みたいなので、注意が必要です。
  • いくら一度にinsert出来るからといっても、その行数は場合によって検討が必要かと思います。1000件位のinsertならば、100件ずつinsertするとか・・・

facebook slideshare rubygems github qiita