MySql一次更新两个表

use*_*449 20 mysql sql-update

我有两个表需要完全相同的值用于非规范化目的.

这是查询.

第一张桌子

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

第二张桌子

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,两个表之间的唯一区别是它们的名称和表两个没有该字段 lid

无论如何将两个更新组合成一个?

rre*_*ein 42

如文档中所述,应该可以使用多表更新.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid)
SET
  a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200,
  b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1
Run Code Online (Sandbox Code Playgroud)

注意:多表不支持LIMIT,因此根据细节可能会导致更多悲伤.

存储过程或事务可能是一个更好的解决方案.


Ato*_*ell 9

如果从Table_One到Table_Two存在一对一或一对多的关系,这将起作用:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid;
Run Code Online (Sandbox Code Playgroud)