2011-09-19 35 views
2

我在MySQL中使用innodb表。我想在一个表中更新几行,每行获得一个不同的值,例如:MySQL事务中的多行多值更新

UPDATE tbl_1 SET 
    col1=3 WHERE id=25, 
    col1=5 WHERE id=26 

在Postgres里,我相信这是可能的:

UPDATE tbl_1 SET col1 = t.col1 FROM (VALUES 
     (25, 3) 
     (26, 5) 
) AS t(id, col1) 
WHERE tbl_1.id = t.id; 

你怎么这有效和高效地做在交易中?

问题我打到目前为止:使用中间的临时存储器表

  • 最终未能成为交易安全
  • 使用临时表 - 再次persumably内存类型 - 几乎是无证和我找不到真实的解释它是如何工作的以及它在我的案例中的效果如何,例如关于在会话的每个事务之后是否截断表的讨论,使用InnoDB表作为临时表并填充,加入以更新然后在交易中截断它似乎是一件非常昂贵的事情;我一直在战斗MySQL的吞吐量差足够,因为它是

回答

2

你与col1根据id

UPDATE tbl_1 SET col1=CASE id WHEN 25 THEN 3 WHEN 26 THEN 5 END WHERE id IN (25,26) 
+0

这种效率的任何想法的情况下,与设定值更新? – Will

+0

不应该是一个问题(因为你使用'WHERE'子句进行筛选,所以MySQL必须只选择这两行(预计你不会替换成千上万行 - 这只会导致一个非常大的声明) 'CASE'声明在这里不是问题) – rabudde

+0

〜3K行每次;与临时表,它需要一秒钟,没有更多。然后我发现 - 在崩溃之后 - MEMORY临时表不是事务安全的。 :(wtf厌倦了mysql – Will