回答編集履歴

1

回答を追記

2016/07/02 15:08

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -13,3 +13,65 @@
13
13
  ```
14
14
 
15
15
  [http://sqlfiddle.com/#!9/99f73/1](http://sqlfiddle.com/#!9/99f73/1)
16
+
17
+
18
+
19
+ ---
20
+
21
+ > hoge,fugaは空の場合もある
22
+
23
+
24
+
25
+ のであれば、ワンクエリでの実現は難しそうですね。
26
+
27
+
28
+
29
+ 統合先のテーブルの`name`カラムにユニークインデックスが張ってある、または張ることが可能であれば、以下のSQL文で実現可能です。
30
+
31
+ ```sql
32
+
33
+ START TRANSACTION;
34
+
35
+
36
+
37
+ INSERT INTO YYY (id, name, hoge, fuga)
38
+
39
+ SELECT id, name, data, NULL FROM XXX WHERE category = 'hoge';
40
+
41
+
42
+
43
+ INSERT INTO YYY (id, name, hoge, fuga)
44
+
45
+ SELECT id, name, NULL, data FROM XXX WHERE category = 'fuga'
46
+
47
+ ON DUPLICATE KEY UPDATE fuga = data;
48
+
49
+
50
+
51
+ COMMIT;
52
+
53
+ ```
54
+
55
+ [http://sqlfiddle.com/#!9/371ece/1](http://sqlfiddle.com/#!9/371ece/1)
56
+
57
+
58
+
59
+ ちなみに、
60
+
61
+ > 進捗が分かるように
62
+
63
+
64
+
65
+ する最も手っ取り早い方法は、1つ目のINSERT文と2つ目のINSERT文の間に適当なメッセージを出力してやることでしょうか。
66
+
67
+
68
+
69
+ さらに細かく進捗を表示したい場合は、SELECT構文にWHERE句を追加し、idを適当な範囲で区切ってINSERTを繰り返す方法が考えられます。
70
+
71
+ ただし、それだけ実装が複雑になりますので、どこまでやるかはコスト(とリスク)とメリットを比較して判断してください。
72
+
73
+
74
+
75
+ なお、この方法でデータを統合する場合、`XXX`テーブルの`category`カラムにインデックスを張ると、速度の改善が期待できます。
76
+
77
+ `SELECT-INSERT`文の`SELECT`時に、インデックスが利用できるからです。