プロが教える店舗&オフィスのセキュリティ対策術

MySQL ver.5.0.95です。
PHPからSQL文を作ってDBへインサートしているのですが
重複した値が合った場合はupdateするように書いています。

TBL1には
|id   |string   |count
1    aaa    0
2    bbb    3
3    ccc    1


TBL2には
|id2    |string2    |count2
1      aaa      0
2      bbb      2
3      ccc      1

実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。
このとき、TBL1のそれぞれをインサート若しくはアップデートするのに
TBL2の同一IDのものの、count2の状態によって場合分けしたく
同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが

insert into TBL1 values
(1, "aaa", 3),
(2, "bbb", 3),
(3, "ccc", 3),
(4, "ddd", 3)
on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END;

#1064 - You have an error in your SQL syntax;というエラーになって出来ません。
WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。
例えば決め撃ちで1つ1つ書くと通ります。
insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END;
insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END;

これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか?

あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、
変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。
まとめると速くなることはあるでしょうか?

A 回答 (1件)

バルク処理でupdateまでやってしまうとなると一度テンポラリテーブルを


作った方がよいかも

//元データ
create table TBL1(id int not null unique key,string varchar(10),count int);
insert into TBL1 values(1,'aaa',0),(2,'bbb',3),(3,'ccc',1);
create table TBL2(id2 int not null unique key,string2 varchar(10),count2 int);
insert into TBL2 values(1,'aaa',0),(2,'bbb',2),(3,'ccc',1);

//処理
create temporary table tmp(id3 int,string3 varchar(10),count3 int);
insert into tmp values (1,'aaa',3),(2,'bbb',3),(3,'ccc',3),(4,'ddd',3);
insert into TBL1
select id3,string3,count3 from tmp
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;

//テンポラリを使わない場合はunionでデータを羅列?
insert into TBL1
select id3,string3,count3
from (select 1 as id3,'aaa' as string3,3 as count3 union select 2,'bbb',3 union select 3,'ccc',3 union select 4,'ddd',3) as list
left join TBL2 on id3=id2 where count2 is null or count2<1
on duplicate key update count=count3;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!