質問するログイン新規登録

回答編集履歴

1

追記

2017/04/11 04:51

投稿

yambejp
yambejp

スコア117995

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