mysql UPDATE多行多键效率

时间:2018-11-06 08:58:08

标签: php mysql mysqli

我已经开始工作了,但是我问我是否可以做得更好(最好以某种方式减少WHERE中所有条件的数量),或者是否有一种方法可以减少执行时间(尽管这似乎可行)比PHP循环每个更新查询要快得多。

我必须用7个主键更新表中的多行(生产一次可能在100-10000之间)(是的。我几乎只想粘贴一个主ID键在上面,但是我必须回去重新编码我的浏览器游戏的大部分内容……) 我不能使用INSERT .. ON KEY DUPLICATE,因为如果更新不存在,我就不应该插入更新(在更新之前在同一张表上做一些删除操作)

我当前的解决方案:

UPDATE planet_market SET

amount = CASE
WHEN resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70 THEN 1
WHEN resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161 THEN 181
ELSE amount END

WHERE (resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70) OR (resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161)

那么,有没有更好的方法(较短的查询)或更快的方法(执行)呢?

1 个答案:

答案 0 :(得分:0)

好吧,我设法找到一种大大缩短查询的方法,而它的工作原理几乎相同(我希望...,我的有限测试似乎执行相同的操作,请对此进行更正),所以我在发布我自己的答案...

方法如下(不要介意使用的数据略有不同,请注意结构的变化):

UPDATE planet_market SET

amount = CASE
WHEN resource_id=3 AND type=0 AND price=2147483647 AND player_id=9 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
WHEN resource_id=4 AND type=0 AND price=250000 AND player_id=8 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
ELSE amount END

WHERE (resource_id, type, price, player_id, planet_id, owner_type, factory_id) IN ((3,0,2147483647,9,2,0,-1),(4,0,250000,8,2,0,-1))

还有其他想法吗?

我希望这可以帮助其他人寻找这样的解决方案(我无法在stackoverflow上找到任何其他有关在具有多个键时更新多行的信息)

我想知道是否可以通过在WHEN THEN内使用WHERE(column1,column2,...)IN(data1,data2,...)来缩短查询...下一步是否要检查(我只会缩短)缺少“ =“ ...大声笑)