題の通りです。SLEECT * FROM soem
の様な検索結果で得られた結果の各行を任意のテーブルに保存するクエリの作り方を紹介します。
以下がそれです。
INSERT INTO copy_dist_table SELECT * FROM copy_from_table;
MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.2.6.1 INSERT … SELECT ステートメント
INSERT SELECTという構文が MySQL に用意されており、カラムの型と数を一致させると細々としたものを書かずにまとめて様々なものを一度に INSERT できます。例は単純な全件取得ですが JOIN や WHERE をはじめとしたよく SELECT で使う様々な機能も使えます。
これの使い道ですが自分の場合、操作のリハーサルやバックアップ的な目的での使用が多いです。データを壊してはいけないデータベースに直に SQL を発行する時、あらかじめ同じ構造のテーブルを用意してそこでリハーサルをします。二重化されるデータ量にマシンが耐えられると確信できる様な時に結構便利です。手順としては次です。
- PhpStorm の DDL 定義操作でテーブル定義を create table な SQL として取得
- 取得した SQL のテーブル名を変更して外部キー制約等のインデックスを消して実行して自由に壊しても問題ないテーブルを追加
- INSERT INTO 元のテーブル名_tmp SELECT * FROM 元のテーブル名 を実行して自由に壊しても問題ないレコード群をテーブルを追加
DDL 定義を操作する | PhpStorm# データベースオブジェクトの DDL 定義を編集する
こうして上で色々操作すると実際にどうなるかすぐわかって楽です。何ならプログラム中で参照しているテーブルを変えてアプリケーション上からどう見えるかも確認できます。何より間違えたらテーブルを DROP してもう一度コピーからするだけなので比較的安全かつ簡易にクエリを叩けます。
便利ではありますが他テーブルのデータやマシンのパフォーマンスに影響が出ると問題ですので使用タイミングは限られます。そういったことを気にするべき時は、全体のバックアップや操作内容を記述したスクリプトを用意して処理に望んだ方がより良いです。