回答編集履歴

1

追記

2017/04/11 04:51

投稿

yambejp
yambejp

スコア114784

test CHANGED
@@ -9,3 +9,67 @@
9
9
  ちなみに先に更新してあとからignore intoすれば
10
10
 
11
11
  更新件数と追加件数が別々に拾えると思います
12
+
13
+
14
+
15
+ # ロジック
16
+
17
+ - 元データ
18
+
19
+ ```SQL
20
+
21
+ create table t1(id int not null unique key,data int);
22
+
23
+ insert into t1 values(1,10),(2,20),(3,30),(4,40),(5,50);
24
+
25
+ ```
26
+
27
+
28
+
29
+ - 新規データ
30
+
31
+ 新規データを投入する際に別テーブルを用意する
32
+
33
+ ```SQL
34
+
35
+ create table t2(id int not null unique key,data int);
36
+
37
+ insert into t2 values(3,300),(4,400),(5,50),(6,600),(7,700),(8,800);
38
+
39
+ ```
40
+
41
+ ※プログラムで実行するときにはtemporary tableで作れば
42
+
43
+ セッションが終了した時点で勝手に消えてくれます
44
+
45
+
46
+
47
+ t1に対してt2を流し込んだ場合の結果
48
+
49
+ ```skip
50
+
51
+ select sum(t1.data=t2.data) as `skip`
52
+
53
+ , sum(t1.data!=t2.data) as `mod`
54
+
55
+ , sum(t1.id is null) as `ins`
56
+
57
+ from t1 right join t2 on t1.id=t2.id;
58
+
59
+ ```
60
+
61
+ skipがidが一緒でdataも一緒のため挿入も更新もされないスキップ件数
62
+
63
+ modがidが一緒でdataが異なるため更新される件数
64
+
65
+ insがt1にデータがないため挿入される件数
66
+
67
+ 上記データを取った上で実際の投入
68
+
69
+
70
+
71
+ ```SQL
72
+
73
+ insert into t1 select * from t2 on duplicate key update data=values(data);
74
+
75
+ ```