如果可能,我正在尝试在单个查询中更新一组记录( boolean
字段)。
输入来自分页广播控件,因此给定的POST
将包含页面值为true
或false
的ID。
我试图走这个方向:
UPDATE my_table
SET field = CASE
WHEN id IN (/* true ids */) THEN TRUE
WHEN id IN (/* false ids */) THEN FALSE
END
但是这导致“真实ID”行更新为true
,所有其他行更新为false
。
我认为我已经犯了一些严重的语法错误,或者说我正在接近这个错误。
对解决方案的任何想法?
答案 0 :(得分:23)
您是否忘记在案例陈述中做了“ELSE”?
UPDATE my_table
SET field = CASE
WHEN id IN (/* true ids */) THEN TRUE
WHEN id IN (/* false ids */) THEN FALSE
ELSE field=field
END
没有ELSE,我假设评估链在最后一个WHEN处停止并执行该更新。此外,您不限制您尝试更新的行;如果你不做ELSE,你至少应该告诉更新只更新你想要的行而不是所有的行(正如你所做的那样)。查看下面的WHERE子句:
UPDATE my_table
SET field = CASE
WHEN id IN (/* true ids */) THEN TRUE
WHEN id IN (/* false ids */) THEN FALSE
END
WHERE id in (true ids + false_ids)
答案 1 :(得分:5)
您可以避免使用field = field
update my_table
set field = case
when id in (....) then true
when id in (...) then false
else field
end
答案 2 :(得分:0)
您可以避免在此任务中使用 case 块,因为您正在设置条件布尔值。
在 id
子句中声明所有应更改的 WHERE
。
在 true
子句的 id
条件中声明所有 SET
IN()
值。如果在 id
中找到任何给定的 IN
,则布尔值将变为 true
,否则为 false
。
TABLE `my_table` (
`id` int(10) UNSIGNED NOT NULL,
`my_boolean` boolean
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `my_table`
ADD PRIMARY KEY (`id`);
INSERT INTO `my_table` VALUES
(1,true),
(2,false),
(3,true),
(4,false),
(5,true),
(6,false);
UPDATE my_table
SET my_boolean = (id IN (2,4))
WHERE id IN (2,3);
SELECT * FROM my_table;
输出:
id my_boolean
1 true
2 true #changed
3 false #changed
4 false
5 true
6 false