howdylikes

Google Developersってわかりづらいよね

MySQLでレコードのコピーを行う

主キーと特定のカラムだけ変えてINSERTしたいみたいなケースの話です

普通に以下のようにやればいいんですがカラムが多い時にカラム名を打つのがしんどいですよね。。。

INSERT INTO テーブル名 (SELECT col1, col2 FROM テーブル名)

SQL組み立てるためのSQL

information_schemaのcolumnsテーブルにテーブル定義情報が入っているのでそれを利用します。

GROUP_CONCATで複数行を1つにまとめます。prefixとsuffixにバッククォートをCONCATで入れます。
ここで取れた内容でSQLを組み立てていきます

-- mydb.articleのカラム情報を取得
SELECT CONCAT('`', GROUP_CONCAT(`column_name` SEPARATOR '`,`'), '`')
FROM information_schema.columns
WHERE
  table_schema = 'mydb'
AND 
  table_name = 'article';
// 実行結果
`article_id`,`title`,`body`

実際に流すSQL

変数を使って条件やら更新内容を定義しておくと再利用しやすいです。
※article_idはAIカラムなので省略しています

SET @source_article_id = 1;
SET @dest_article_title = '新しいタイトル';

INSERT INTO mydb.article
(`title`,`body`)
(
  SELECT @dest_article_title,`body`
  FROM mydb.article
  WHERE article_id = @source_article_id
);

あとがき

連番データも変数を使って1ずつ足していくとかにすれば同じINSERT文を100個流すとかで作れそうです