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