回答編集履歴
1
追記
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
|
+
```
|