はじめに
DBのパフォーマンス改善を実施中に似たような条件のテーブルをいくつか用意する必要があり、その際に実施したコマンドやエラー解消について残しますので参考にしていただけますと幸いです。
開発環境
mysql:8.4.0
(確認用コマンド select version(); )
中身ごとテーブルを複製する方法
複製コマンド
CREATE TABLE [新テーブル名] LIKE [コピー元テーブル名];
INSERT INTO [新テーブル名] SELECT * FROM [コピー元テーブル名];
解説:
CREATE TABLE 新テーブル名 LIKE コピー元テーブル名; は、指定した「コピー元テーブル名」の構造(カラム、データ型、インデックスなど)をそのまま使って、「新テーブル名」として新しいテーブルを作成します。
INSERT INTO 新テーブル名 SELECT * FROM コピー元テーブル名; は、「コピー元テーブル名」からすべてのデータを取得して、「新テーブル名」に挿入します。
エラー対処
上記実行時に日付関連のエラーが出た場合、以下を実行
SELECT @@sql_mode;
解説:
SELECT @@sql_mode;で、現在のSQLモードがどう設定されているかを確認します。
STRICT_TRANS_TABLESモードの場合、日付に0000-00-00など無効な値が含まれているとエラーとなります。
結果に'STRICT_TRANS_TABLES'が含まれていれば以下を実行
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
または、
SET sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');
解説:
ここでは、SQLモードを STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION に設定しています。
NO_ENGINE_SUBSTITUTION はエンジンの指定がない場合に自動で代替エンジンを使用しないようにする設定です。
STRICT_TRANS_TABLES を外すことで、0000-00-00のような日付がエラーとならず、代わりに警告が出るようになります。
補足
SELECT @@sql_mode;
で使用した@@とはmysqlサーバのセッション変数を参照するためのものです。
@@global.sql_modeのようぬするとサーバ全体の設定を参照できます。
@@session.sql_modeまたは@@sql_modeのようにすると現在のセッション内での設定を参照することができます。
そのため、ほかのセッションや全体設定は影響を与えないで一時的に変更することができます。
参考文献
本記事は以下情報を参考にして執筆しました。