mysql更新多行多键效率

nuypyhwy  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(482)

我已经做到了,但是我在问我是否可以做得更好(最好是以某种方式减少where中所有条件的数量),或者是否有一种方法需要更少的执行时间(尽管这似乎比php循环每个更新查询要快得多)。
我必须用7个主键更新一个表中的多行(生产中可能会在100-10000行之间)(是的..我几乎到了只想在表上粘贴一个主id键的地步,但是我必须返回并重新编码我的浏览器游戏的太多内容…)我不能使用insert。。因为我不应该在更新不存在时插入它(在更新之前在同一个表上做一些删除)
我当前的解决方案:

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)

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

z9ju0rcb

z9ju0rcb1#

好吧,我设法找到了一种方法,大大缩短了查询,而它的工作原理几乎相同(我希望…,我有限的测试似乎执行相同的,请纠正我在这方面),所以我张贴我自己的答案。。。
下面是方法(不要介意使用的数据略有不同,注意结构的变化):

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,…)(data1,data2,…)来缩短查询。。。下一步我会检查一下(我只会缩短它,缺少“=”。。。哈哈)

相关问题