2011/02/11 SQLのInsert文をたくさん作る方法

昔書いた社内ブログ記事です。

---

どうも（ｐ・&omega;・ｑ）

後輩に「データベースにサンプルデータを入力するのが面倒くさい」と言われました。
聞いたら手作業で1つずつ入力しているとか。

というわけで、データベースのInsert文をいっぱい作る方法を書きます。


+

とりあえず10人分のユーザデータを入力したいということにします。

### 完成図

```sql:SQL
insert into user_table (user_name, group_id, user_email) values ('ユーザー1', '1', 'email1@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー2', '2', 'email2@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー3', '3', 'email3@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー4', '4', 'email4@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー5', '5', 'email5@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー6', '6', 'email6@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー7', '7', 'email7@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー8', '8', 'email8@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー9', '9', 'email9@adress.com');
insert into user_table (user_name, group_id, user_email) values ('ユーザー10', '10', 'email10@adress.com');
```


## 方法１：プログラムからSQLを実行すればいいじゃない

<a href="http://www.k4.dion.ne.jp/~mms/unix/shellscript/shell_cont.html#3" target="_blank">シェル</a>でもPHPでもループさせながらInsert文を実行させればいいじゃない。
性能試験用のデータはそうやってバッチで入力しますよぅ。

自分用ならせいぜい100件くらいでしょうし、あんまり性能を考えずに
Insert文を100個連発してもそんなに大した時間じゃないと思いますよ。

・・たぶんｗ



## 方法２：SQL文でループを使えばいいじゃない

<a href="http://www.postgresql.org/docs/8.0/static/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS" target="_blank">SQLにもループはあるんですよ</a>。私はこの方法を使っています。

サンプルコードを貼ろうと思いましたが、家のPCにPostgres環境がないのでやめました。
あ、今家ですよ。三連休なのに、雪なうですよ。



## 方法３：Excelで生成すればいいじゃない

プログラマのくせにプログラム書きたくないっていうならExcelでいいじゃない（笑）
こっちの方が早いこともありますよね。

たぶん詳細の説明はいらないでしょうが、気が向いたので書きました！


<span style="font-size: medium;"><strong>1. 元になるSQL文を書く</strong></span>

<a href="https://picasaweb.google.com/lh/photo/RhNppXwZBFNLN69m9QBVdQ?feat=embedwebsite"><img height="89" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRK_hryNI/AAAAAAAAAWE/9bmdOnsH8XE/s400/20110211_1.jpg" width="400" /></a>


<span style="font-size: medium;"><strong>2. Excelにコピペする
</strong></span>
<a href="https://picasaweb.google.com/lh/photo/svFohbeAh2FNXVnreZQ5gw?feat=embedwebsite"><img height="169" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRMDN6YQI/AAAAAAAAAWI/wYhZJVPtDF8/s400/20110211_3.jpg" width="400" /></a>

数字を含む部分は列を分けないと、片方しか1、2、3、&hellip;、ってインクリメントしてくれないですよ。


<span style="font-size: medium;"><strong>3. 数字を増やしながら複製する
</strong></span>
<a href="https://picasaweb.google.com/lh/photo/Q2NBzEnWWkxX8KKXesraRQ?feat=embedwebsite"><img height="169" src="https://lh6.googleusercontent.com/_9JzdOC0XbDg/TVTRMkjrFZI/AAAAAAAAAWM/dN33HMkSZr0/s400/20110211_4.jpg" width="400" /></a>

セルの右下を引っ張るとコピーできる、おなじみのアレです。
<a href="http://www.eurus.dti.ne.jp/~yoneyama/Excel/input_autofir.htm" target="_blank">オートフィル</a>っていう名前があるらしいですね。

<a href="https://picasaweb.google.com/lh/photo/VlX90JwlfFwlmtApfg2ZUw?feat=embedwebsite"><img height="169" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRNMHSGxI/AAAAAAAAAWQ/nsk6QaP8NjE/s400/20110211_5.jpg" width="400" /></a>

こっちもコピー。


<span style="font-size: medium;"><strong>4. テキストエディタにコピペする
</strong></span>
<a href="https://picasaweb.google.com/lh/photo/wF1hz0gIVE_iRReC6Vdzww?feat=embedwebsite"><img height="169" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRNovIaEI/AAAAAAAAAWU/zTMqf7kDuac/s400/20110211_6.jpg" width="400" /></a>

全部のセルをまとめてコピー。

<a href="https://picasaweb.google.com/lh/photo/qRWfOQ4eLp29toOT_3UYSA?feat=embedwebsite"><img height="167" src="https://lh6.googleusercontent.com/_9JzdOC0XbDg/TVTROGCBvcI/AAAAAAAAAWY/h_UDwXQ8txM/s400/20110211_7.jpg" width="400" /></a>

ペタ。
コピペは「コピー＋ペタ」だと思っていましたよ。


<span style="font-size: medium;"><strong>5. そのままだとタブがあるので半角スペースに変換する
 </strong></span>
<a href="https://picasaweb.google.com/lh/photo/NoTOC5uhZoF9nQ_tioNO0Q?feat=embedwebsite"><img height="301" src="https://lh4.googleusercontent.com/_9JzdOC0XbDg/TVTROondHSI/AAAAAAAAAWc/NOx6nwpvIZo/s400/20110211_8.jpg" width="400" /></a>

セルとセルの間にタブができちゃうので半角スペースに直します。
削除でもいいですけれど。

置換できないテキストエディタを使っている人は問題外です（｀・&omega;・&acute;）ｷﾘｯ


<span style="font-size: medium;"><strong>6. あ、入力するカラム1つ忘れてた！ってときに</strong></span>

2つ目のカラム（group_id）の後ろに3つ目のカラム（user_email）を追加します。
方法はいくらでもありますが、置換を使いましょう。
 
<a href="https://picasaweb.google.com/lh/photo/2jBPFGh74RQ32889Gjysow?feat=embedwebsite"><img height="301" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRPFuOrBI/AAAAAAAAAWo/bS4nTokadWo/s400/20110211_9.jpg" width="400" /></a>

まずはカラム名のところを変更。

置換前：　group_id
置換後：　group_id, user_email

<a href="https://picasaweb.google.com/lh/photo/jTS1fYPtPJ-xzXJvri3RCA?feat=embedwebsite"><img height="301" src="https://lh6.googleusercontent.com/_9JzdOC0XbDg/TVTRPvqDr7I/AAAAAAAAAWw/uafpUZr-CSM/s400/20110211_10.jpg" width="400" /></a>

次に値のところを変更。
こっちは全部違う番号が振ってあるので、正規表現で置換します。

正規表現って何ですかって言われたので、これについて今度書こうかなー。
まぁ、こういう方法もあるってことで。<a href="http://strfriend.com/" target="_blank">これ楽しい</a>ですよ。

置換前：　`'([0-9]+)'`
置換後：　`'\1', 'email\1@address.com'`


ちなみにこの例で使っているのは<a href="http://sakura-editor.sourceforge.net/" target="_blank">サクラエディタ</a>ですが、
これは<a href="http://daredemopc.blog51.fc2.com/blog-entry-316.html" target="_blank">短径選択</a>とかマクロとか色々便利ですよねー。


<span style="font-size: medium;"><strong>7. 完成</strong></span>

<a href="https://picasaweb.google.com/lh/photo/0q-JOBw1Jd1g70HHSZguzA?feat=embedwebsite"><img height="168" src="https://lh3.googleusercontent.com/_9JzdOC0XbDg/TVTRQA8Sn-I/AAAAAAAAAW0/nF4eQUfJG0g/s400/20110211_11.jpg" width="400" /></a>


## まとめ

他にも方法はいろいろありそうですね。

後輩を見ていて思うのですが、知らないことに気づくっていうのは、何を知らないかがわからないので結構むづかしいんじゃないかなってことです。

「こういうものがある」っていうヒントや単語を少しでも知っていればGoogle先生も答えてくれますが、そうでない場合に新しいことをオンラインで知るのって結構むづかしいですよね。

<a href="http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%90%E3%83%87%E3%82%A3" target="_blank">カバディ</a>っていうスポーツの名前も特徴も知らないのに、このスポーツの存在に気が付くことはむづかしいっていうことですね。


欲しい情報の見つけ方っていうのは、割と重要ですね。
あとは、自分から情報を探しにいくだけじゃなくて、RSSを購読するとかも役に立ちますよね。

テレビでニュース番組を見るようなものです。
うちにはテレビと呼べるものがありませんが。