我有一个程序需要将它经常更改的值(在临时内存中)与数据库同步。该表中的关键键(不是主要的!)是列 id 。我的程序更改了 id ,但也将旧的 id 保留在内存中。
现在,我想在一个语句中为多个记录/行更新几个指定的列。此外,对于5到10个此类语句,在1秒内使用4 GB RAM和~50 MBit / s连接不仅可以用于这些sql调用,它应该相当快。
我的sql-specifications
我尝试使用括号......
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调用的程序而言是丑陋的。
欢迎提出答案和建议!
答案 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)