2016/11/02
データベースのレコードを一発で複製してみる
やりたいこと
既にあるレコード(データ)を複製したい。
だけど重複してはいけないものがあるから、そのカラムだけは一部置き換えたい。
だけど重複してはいけないものがあるから、そのカラムだけは一部置き換えたい。
これを一回ダンプ取って、
それを編集して、
またリストアする・・・と言う手順を踏まずクエリを工夫して実施する
実際に発行したクエリ
以下のようなレコードがあるとする
1 2 3 4 | id name birthday type 1 hoge 2016-10-01 1 2 fuga 2016-11-11 1 3 foo 2016-12-12 2 |
これを複製しつつtypeを+1し、nameは末尾に2をつけてみる。
1 | INSERT INTO sample_table VALUES (SELECT NULL AS id, CONCAT(name, '2') AS name, birthday, (type+1) AS type FROM sample_table); |
1. SELECT以下で既存の全てのレコードを引っ張ってくる
2. id はNULL固定(自動連番が割り振られる)
3. name は末尾に2を文字として追加するので、文字列結合のCONCATを使用
4. birthday はそのまま
5. typeは+1したものを囲って AS typeとする
一度のクエリでもサブクエリを使用すれば結構色々出来ます。
外部キー成約で躓くとき
INSERTを先に済ませてあとで外部キー関連を直したいときもあります。
そう言ったときのおまじない
1 | SET FOREIGN_KEY_CHECKS = 0; |
とすれば外部キー制約無しでデータの更新や削除が出来ます。
必ず終わったら
SET FOREIGN_KEY_CHECKS = 1;
として制約を元に戻してやること。
自身を参照してアップデートが出来ないとき
サブクエリでのSELECTしたものと同じテーブルにINSERT出来ないケースもあります。
そう言った時は
1 | (SELECT ********** FROM hogehoge) |
のようなクエリを
1 | SELECT ******** FROM (SELECT ********** FROM hogehoge) AS TMP |
のように一度一時テーブルとして認識させれば回避出来ます
Author Profile
スターフィールド編集部
SHARE