26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SQL】膨大なINSERT文をとにかく楽して生成したい

Posted at

はじめに

検証の際などボリューミーなデータが必要になると、作るのにかなり億劫ですよね:rolling_eyes:

今回は、Excel(+メモ帳)を使用して膨大なINSERT文を生成する方法をご紹介します。

こちらは"MySQL"を想定しております。
他データベースと異なる点に関しましては、適宜修正してください。

INSERT文とは

SQLの知見があまりない方向けにご説明しておくと、INSERTは"該当テーブルにデータを投入するSQL文"です。

INSERT INTO スキーマ名.テーブル名 (`カラム名1`, `カラム名2`, `カラム名3`) VALUES ('値1', '値2', '値3');

これで1レコード(行)分です。
数レコードならデータベース上で手打ちでも問題ないのですが、何万レコードとなると発狂します。
腱鞘炎になっちゃう。。業務とはいえ、たまに投げ出したくなる

INSERT文の生成方法

ここからが本題です。
何万レコードを手打ちはさすがに現実的ではないので、私はExcelとメモ帳を駆使しINSERT文を作っています。

■ Excel

まずはINSERT文生成用のExcelフォーマットを用意する必要があるので、構成からご説明いたします。

全体

スキーマ名.テーブル名、カラム名を関数で取得し、INSERT文に自動反映されるようにしています。
スクリーンショット 2024-03-13 213355.png

値を直接入力

F8~H10

スキーマ名.テーブル名、カラム名を取得

C2:スキーマ名
C3:テーブル名
C4:=C2&"."&C3

F7~:カラム名

INSERT文に各カラム名を取得

E列:

="INSERT INTO "&$C$4&" (`"&$F$7&"`,`"&$G$7&"`,`"&$H$7&"`)VALUES('"

最後の値に閉じ括弧+αを付与

2レコード目以降は1レコード目の値をコピペ
B列:=H8 ※最後のカラム列
C列:');
D列:=B8&C8

D列の値を最後の列(H列)に値貼り付け
※B列、D列の関数に変な値が反映されてしまっていますが、以降の工程には影響しないので問題ないです。
スクリーンショット 2024-03-13 214155.png

■ メモ帳 ※サクラエディタ推奨

Excelの値をそのままデータベース上にコピペするだけでは構文が不十分なので、メモ帳で置換する工程を挟みます。

メモ帳に値を貼り付け

E8からH10をコピーして貼り付け
スクリーンショット 2024-03-13 221952.png

正規表現に☑を入れて、以下を置換

置換前:¥t ※"¥t"という文字列ではなくtabキーでできた空欄
置換後:','

正規表現に☑を外して、以下を置換

置換前:('',
置換後:(

置換完了後、メモ帳の値をすべてデータベース上に貼り付けると、実行できる状態になります。
スクリーンショット 2024-03-13 223733.png

データベース上に、データが正常に投入されました!
スクリーンショット 2024-03-13 223825.png

最後に

今回は、膨大なINSERT文を楽して生成する方法をご紹介いたしました。
今後暇を見つけて、もっと効率的かつやりやすい方法を実践してみようと思います。(おそらく先は長い。。)

最後までお読みいただき、ありがとうございました:information_desk_person_tone1:

26
25
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?