根据1个CASE条件更新多个列

时间:2014-08-15 11:50:07

标签: mysql sql

我有一个程序需要将它经常更改的值(在临时内存中)与数据库同步。该表中的关键键(不是主要的!)是列 id 。我的程序更改了 id ,但也将旧的 id 保留在内存中。

现在,我想在一个语句中为多个记录/行更新几个指定的列。此外,对于5到10个此类语句,在1秒内使用4 GB RAM和~50 MBit / s连接不仅可以用于这些sql调用,它应该相当快。

我的sql-specifications

  • 服务器:127.0.0.1 via
  • TCP / IP
  • 软件:MySQL
  • 软件版本:5.5.27 - MySQL社区服务器(GPL)
  • 协议版本:10
  • 服务器字符集:UTF-8 Unicode(utf8)

我尝试使用括号......

UPDATE someTable
SET (id, name) = CASE id 
WHEN 1 THEN (111, "Dr. Frankenstein") 
WHEN 2 THEN (222, "the Monster") 
WHEN 3 THEN (333, "Mr. X") 
ELSE (id, name) END
WHERE id IN (1, 2, 3)

...只会导致以下错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(id, name) = CASE id WHEN 1 THEN (111, "Dr. Frankenstein") WHEN 2 THEN (222,' at line 2

知道我想知道:有没有办法用当前语法只用一个语句来做?它是可行的,或者我应该将它分成多个语句,这对于进行sql调用的程序而言是丑陋的。

欢迎提出答案和建议!

2 个答案:

答案 0 :(得分:0)

case语句只返回一个值:

UPDATE someTable
    SET id = (CASE id WHEN 1 THEN 111 WHEN 2 THEN 222 WHEN 3 THEN 333 ELSE id END),
        name = (CASE id WHEN 1 THEN 'Dr. Frankenstein'
                        WHEN 2 THEN 'the Monster'
                        WHEN 3 THEN 'Mr. X'
                        ELSE name
                END)
    WHERE id IN (1, 2, 3);

为了提高性能,请确保您在id上有一个索引。这有助于查找要更新的记录。请注意,更改id值需要更新索引,该索引可能比正常update更长一些。但是,期望每秒5-10次交易是合理的。

答案 1 :(得分:0)

希望这有效:

UPDATE someTable
SET id = CASE 
id 
WHEN 1 THEN 111
WHEN 2 THEN 222
WHEN 3 THEN 333
ELSE id END
,
 name = CASE 
id 
WHEN 1 THEN "Dr. Frankenstein" 
WHEN 2 THEN "the Monster" 
WHEN 3 THEN "Mr. X" 
ELSE name END

WHERE id IN (1, 2, 3)