我有两个表需要完全相同的值用于非规范化目的。
这是查询。
第一张表
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
无论如何要将两个更新合并为一个?
答案 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 BY
或LIMIT
。
答案 3 :(得分:0)
如果您可以加入表,那么您可以创建两个表的视图,然后通过该视图进行更新。在您的示例中, userid 似乎是合适的密钥。
在创建视图时,您需要坚持following guidelines。