MySql一次更新两个表

时间:2012-01-06 22:47:17

标签: mysql sql-update

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

这是查询。

第一张表

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1

第二张表

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1

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

无论如何要将两个更新合并为一个?

4 个答案:

答案 0 :(得分:40)

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

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

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

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

答案 1 :(得分:8)

如果从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;

答案 2 :(得分:0)

它们是两个单独的查询,因此必须这样对待。很抱歉这么说,但是如果您要更新两个具有相同数据的表,那么可能有更好的方法来设计数据库。请记住保持编程DRY

编辑:应该撤消;您可以将它用于多个表格,但不能使用ORDER BYLIMIT

答案 3 :(得分:0)

如果您可以加入表,那么您可以创建两个表的视图,然后通过该视图进行更新。在您的示例中, userid 似乎是合适的密钥。

在创建视图时,您需要坚持following guidelines