複数レコードの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,'用紙');
確認
通常のinsert
- レコードが1件登録されました。
- 1件のみのinsertであれば良いですが、複数のレコードをinsertする場合はこれを繰り返すことになります。
まとめてinsert
- ためしに2レコードのinsertを行いました。
- 「select * from dual」が?だったのですが、これはselectした内容をinsertデータとして使用するための様です。selectの内容が必要ない場合は、とりあえずdualで対応?(文法的に必須みたい)
- selectの内容を使用する場合は、以下のようになります。
- この様なinsert文を、oracleでは「マルチテーブル・インサート」と呼ぶそうです。
- マルチテーブルなので、1本のSQLで複数のテーブルにinsertすることも可能です。
その他のDBMS
MYSQL
- MYSQLの場合は、同じ様に複数のデータを一度にinsertすることができます。
SQLServer
- SQLServer2008から以下のように一度にinsertすることが出来るようです。(未確認)
Insert Into テーブル名(項目名1,項目名2) Values (1,a),(2,b)
- ただ一度にinsert出来るレコード数に制限があり、デフォルトでは1000行みたいなので、注意が必要です。
- いくら一度にinsert出来るからといっても、その行数は場合によって検討が必要かと思います。1000件位のinsertならば、100件ずつinsertするとか・・・