2025.02.25

【備忘録・Laravel】一時テーブルを作成してメインテーブルに複製する方法
こんにちは
MaromaroのTakaです。
今回は備忘録として一時テーブルを作成し、その中身をメインテーブルに複製する方法を記載します。
一時テーブルの作成からの複製を行うきっかけは、オートインクリメントを保持しつつ安全にテーブルに値をインサートしたいためです。
今回使用した案件では、既存のテーブルの中身を空にしつつ、新たなレコードを新規で登録する必要がありました。
そのため、トランザクションを用いて安全に行おうと思いましたが、オートインクリメントのリセットを考えると、truncate(オートインクリメントをリセットしつつテーブルのDELETE)ではトランザクションの対象外になってしまうため、安全に行う方法として一時テーブルからの複製を採用しました。
※トランザクションはtry・catchと合わせることでエラー時に安全にテーブルへの変更等をロールバックすることが可能な処理
実装方法
まず一時テーブル作成は以下のようにします。
use DB;
DB::statement('CREATE TEMPORARY TABLE temp_users LIKE users');
users、temp_usersの部分は適宜変更してください。
このプログラムを実行するとusersテーブルの構造を丸っと複製する形になります。(値はコピーされない)
この作成されたtmpはDBセッションの終了後自動的に削除されます。
※スクリプトの実行終了後に消えると考えて良いと思います。
内容にもよると思いますが、一時テーブルにインサートを行うため、トランザクションは使用しないでも良いとは思います。
次に一時テーブルにインサートする値を作成し、インサートした後実際に複製する処理を行います。
//データをtmpにインサートする
DB::table('temp_users')->insert($data);
//メインテーブルの中身を削除する
DB::table('users')->truncate();
//tmpからメインテーブルに値をインサート
DB::statement('INSERT INTO users SELECT * FROM temp_users');
上記で一通りの流れは完了します。
注意点として、try・catchなどは必ず入れて例外処理はしっかり行わないと、意図しない形でメインテーブルが削除されてしまう可能性はあります。
※基本的に致命的なエラーが発生するようであれば、tmpへのインサートで止まると思うので、大丈夫とは思いますが…
以上、Takaでした。