我有这张桌子:
CREATE TABLE IF NOT EXISTS `my_table` (
`A` int(11) NOT NULL,
`B` int(11) NOT NULL,
`C` varchar(50) NOT NULL,
`D` varchar(30) NOT NULL,
PRIMARY KEY (`A`,`B`,`C`)
)
我想在一个查询中更新几个条目。我试过这个:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
END
但是此查询会更新表中的所有条目。它完全更新了我想要更新的两个条目的'D'的值,但它也删除了其他条目的“D”值,我希望它们保留其先前的值。
答案 0 :(得分:8)
如果您没有向else
表达式明确添加case
子句,则隐式表现为您已将else null
添加到其中。因此,您的更新语句实际上等同于:
UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
ELSE NULL
END
这解释了为什么您看到D
被删除"。
一种方法是明确添加一个只返回else
的{{1}}子句:
D
另一种方式,有点" clunkier"语法,但可能会稍微好一点,是添加UPDATE my_table
SET D = CASE
WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
ELSE D
END
子句,只有相关的行更新:
where