🤹
INSERT-SELECTでSELECT結果を一括INSERTする
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