同时更新两个MySql表格

32

我有两个表需要相同的值以进行反规范化。

下面是查询代码。

第一个表:

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个回答

61

根据文档所述,使用多表更新应该是可能的。

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,因此这可能会根据具体情况造成更多的麻烦。

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


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

0
如果您可以连接表格,那么您可以创建两个表格的视图,然后通过该视图进行更新。在您的示例中,userid 可能是一个适合作为键的字段。
在创建视图时,您需要遵循以下指南

-1

它们是两个独立的查询,因此必须分别处理。很抱歉要说,如果您正在使用相同数据更新两个表格,则可能有更好的方法来设计您的数据库。请记住保持您的编程DRY

编辑:应该撤回那个说法;您可以将其用于多个表格,但不能使用ORDER BYLIMIT


我明白你的意思,但是对于我们的情况,我们经常重置表1的分数。表2是永久分数,这就是为什么我们需要两个表的原因。只是我有5个更新查询连续执行(批处理),想知道是否可以减少到数据库的访问次数。 - user962449
1
将一个字段添加到表中不是更容易吗?该字段默认为“1”,但当您需要“重置”表时,可以将其设置为“0”。 - Zoe Edwards
@user962449 在寻找类似解决方案时遇到了这个。这个答案是错误的 - 作者已经指出了这一点。你应该接受下面更好的答案。 - user1864610
@user1864610 我也遇到了这个问题。虽然从技术上讲是可行的,但这可能不是一个好主意。这样做的必要性通常表明设计有缺陷(这可能意味着各种缺陷,例如缺少抽象)。Thomas 在这里基本上是正确的,即_DRY_。 - Powerslave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接