【これだけ】SQLでSELECT結果をINSERTする方法【現役SEが解説】

PROGRAM

今回は、SQLでSELECT結果をINSERTする方法について、単純に追加する方法と不足分を追加する方法に分け、簡単に解説していきます。

SELECT結果を単純に別テーブルにINSERTする方法

バックアップ用テーブルの作成等で、テーブルの中身をそのまま別のテーブルにコピーしたいことがあると思います。

このような場合には、レコードを追加するINSERT文にレコードを取得するSELECT文を入れることで実現することができます。

INSERT INTO {inserted_table_name} SELECT * FROM {inserting_table_name};

カラムを指定する場合には、INSERT文とSELECT文の両方でカラムを指定しなければいけません。

INSERT INTO {inserted_table_name} ({column_name},…) SELECT {column_name},… FROM {inserting_table_name};

当然SELECT文にはWHERE句等を使って条件で絞ったレコードのみを抽出し、INSERTすることも可能です。

別テーブルの不足分のレコードをSELECTを使ってINSERTする方法

あるテーブルから別テーブルにデータをコピーする際に、不足分だけをコピーするには、以下のSQL文で可能です。

INSERT INTO {inserted_table_name} AS A SELECT * FROM {inserting_table_name} AS B WHERE NOT EXISTS (SELECT * FROM {inserted_table_name} WHERE A.{key_column_name} = B.{key_column_name});

括弧内のSELECT文では両方のテーブルにあるものを抽出して、NOT EXISTS句で、その反対、すなわち、両方にないものだけをSELECTしてINSERTすることができます。

MySQLでAUTO_INCREMENTの欠番を防ぐことにも使える

MySQLでは、主キー以外にユニークキーを設定して重複チェックをMySQLの機能に委ねることができますが、AUTO_INCREMENTを使用している場合、欠番が出ることがあります。

結論から言うとユニークキーの設定は不要となるのですが、今回解説したWHERE句で条件を絞ってSELECTした結果をINSERTするという方法を応用することで、この問題を回避することができます。

name
user_id user_cd
1 1001 山田太郎
2 1002 田中花子
3 1003 小林一郎

例えば、上記のようなusersテーブルがあり、user_idがAUTO_INCREMENTの主キーで、user_cdが主キーではないものの重複を許さないユニークキーであるとします。

この例のテーブルに、user_cdの1001のレコードを追加しようとすると、既に存在するためエラーとなってはくれますが、次回レコード追加時に主キーのuser_idが連番ではなくなってしまいます。

INSERT INTO users (user_cd, name) SELECT '1001', '山田太郎' FROM users WHERE NOT EXISTS (SELECT * FROM users WHERE user_cd = '1001');

そこで、上記のようにSELECT文を活用してINSERTさせると、ユニークキーが重複した場合でも、AUTO_INCREMENTのuser_idの連番に影響を与えることなく、欠番をなくすことができますので、とても有用なSQL文となります。