假设我有一个表,其中包含user_id,car_id和selected列。一个用户可以拥有多辆汽车,但一次只能选择使用1辆。我可以使用两次不同的数据库调用来更新它们的值,一次将所选汽车更新为1,然后第二次调用将先前选择的汽车更新为0,我将如何在1步中执行此操作?
UPDATE cars SET selected = 0 WHERE user_id = <id> AND selected = 1
UPDATE cars SET selected = 1 WHERE user_id = <id> AND car_id = <car_id>
通常是我现在所拥有的。
UPDATE cars
SET selected = 1-selected
WHERE user_id = <id>
AND (selected = 1 OR car_id = <car_id>)
您可以使用带有UPDATE
表达式的CASE
查询来根据selected
设置car_id
的值。例如,将user_id = 1
的选定汽车设置为1:
UPDATE cars
SET selected = CASE WHEN car_id = 1 THEN 1 ELSE 0 END
WHERE user_id = 1
避免任何不必要的更新,因为仅必须更新两行:
car_id = <car_id>
必须将selected
列设置为1
的行selected = 1
的当前行必须设置为0
。UPDATE cars
SET selected = (car_id = <car_id>)::int
WHERE user_id = <id> AND (car_id = <car_id> OR selected = 1);