勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

MySQLでwhere句を使ってカラム指定でデータをコピーする方法

   2024/02/22  MySQL / MariaDB

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且つカラムを指定して他のテーブルにコピーしたかった。ダンプしてインサートしようかと思って少し試したところデータ量が多いからか時間がかかりすぎた。何か方法は無いか探したところ簡単にコピーできる方法があった。

 

SQL文

INSERT INTO 
    コピー先のテーブル名 
    (カラム, カラム) 
SELECT 
    (カラム, カラム) 
FROM 
    コピー元のテーブル名 
WHERE 
    WHERE区を適当に

例えば以下条件の場合は、

  • テーブルAからテーブルBにコピー
  • カラムはidとnameを入れたい
  • テーブルBには新カラムのコピー日時をregist_dateカラムとして入れたい
  • WHERE句はテーブルAのdateカラムで2016-01-01から2016-01-31までを指定

以下のような形になる。

INSERT INTO 
    table_b 
    (id, name, regist_date)
SELECT 
    (id, name, NOW()) 
FROM 
    table_a 
WHERE 
    date BETWEEN '2016-01-01' AND '2016-01-31'

WHERE句はさらにANDとかで絞込み検索が可能。

 

その他

絞込み検索をダンプしてインポートする方法だと100万件ほどのデータで1時間ほどかかったが、この方法だと5分もかからずに処理できた。

 - MySQL / MariaDB

  関連記事

MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)
MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)

MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過 ...

MySQLでCSVから列を指定してインポート
MySQLでCSVから列を指定してインポート

MySQLでCSVからデータをインポートしたかった。またエクセル風にいうA列はi ...

MySQLでSELECT時に数値を3桁ずつのカンマ区切りに変換する方法
MySQLでSELECT時に数値を3桁ずつのカンマ区切りに変換する方法

MySQLで商品価格のような数値の値を3桁ずつのカンマ区切りで取り出したいという ...

MySQLでカラム内容によって条件分岐させたい場合の対応方法
MySQLでカラム内容によって条件分岐させたい場合の対応方法

MySQLでカラムの内容によって条件を分岐させたかった。またPHPで処理するので ...

MySQLのトリガーを使用して特定のテーブルの操作を行った際に別テーブルにログを残す方法
MySQLのトリガーを使用して特定のテーブルの操作を行った際に別テーブルにログを残す方法

MySQLにトリガーという機能があるらしくどのようなものか調べたところ、事前に「 ...