🤹

INSERT-SELECTでSELECT結果を一括INSERTする

2021/11/05に公開

INSERT-SELECTでSELECTした値を一括INSERTするやり方が便利

下記2つのテーブルが存在するとし、userテーブルにはまだ値が入っておらず、これから、personテーブルの値をuserテーブルに移行したいケースを想定します。

personテーブル

id name prefecture age
1 taro tokyo 23
2 jiro tokyo 19
3 saburo tokyo 21

userテーブル

id name age user_type

id = auto_increment

personテーブルのレコードの値を使って、userテーブルに値をINSERTしたい場合、通常
まずpersonテーブルの値をselectして得られた結果を元にINSERT文を作成したり、Sequel Ace GUIのようなGUIツールを用いて、1件1件値をINSERTしていく形になると思います

SELECT * FROM user WHERE id = 1;

その結果から、

id = 1を

insert into .........

id = 2を

inset into ..........

面倒くさいですよね。。。。

SELECTするレコードが多ければ多いほど、現実的に1回1回INSERT文を実行するのは困難なので、
効率のいい方法があります。

それが、INSERT-SELECTという書き方です。

INSERT INTO user (name , age , user_type) SELECT person.name , person.age , 'NORMAL' FROM person;

上記クエリを1度実行すると、上のpersonテーブルに3件のレコードが新規作成されます。

userテーブル

id name age user_type
1 taro 23 NORMAL
2 jiro 19 NORMAL
3 saburo 21 NORMAL

SQL文解説

INSERT INTO user (name , age , user_type)

この部分で値の指定が必要なカラムを記述します。(idはauto_incrementなので除外)

SELECT person.name , person.age , 'NORMAL' FROM person;

この部分で、値の指定が必要なカラムをpersonテーブルから引っ張ってくるよう記述します。
すべてのレコードに対して固定値を登録することもでき、上記SELECT内に'NORMAL'のように書けます。

Discussion