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個流すとかで作れそうです