我有一个包含2列的简单MYSQL表:
id | status
1 | b
status
是ENUM('a','b','c')
我想更新此行,以便:if:
1)当前状态为c
,然后是新值b
2)当前状态为b
,然后是新值a
3)当前状态为a
,然后不执行任何操作
我尝试了以下但当然不起作用:
UPDATE table SET status = status - 1 WHERE id = '1'
答案 0 :(得分:3)
UPDATE tablename SET status = case status when 'b' then 'a'
when 'c' then 'b' end
WHERE id = '1' and status <> 'a'
(<> 'a'
中的WHERE
是为了避免交易中的“a”行。)
答案 1 :(得分:2)
试试这样:
update table_name
set status = case when status = 'c' then 'b'
when status = 'b' then 'a'
when status = 'a' then 'a'
end
where id = 1;
答案 2 :(得分:0)
MySQL具有枚举类型的索引值,因此您执行status = status - 1
的方法是一种很好的方法。
正如manual所说:
每个枚举值都有一个索引:
- 列规范中列出的元素将分配索引号,从1开始。
- 空字符串错误值的索引值为0.这意味着您可以使用以下SELECT语句查找分配了无效ENUM值的行:
SELECT * FROM tbl_name WHERE enum_col=0;
- NULL值的索引为NULL。
- 这里的术语“索引”是指枚举值列表中的位置。它与表索引无关。
所以在你的情况下,这些是索引值:
基于此,你可以简单地写:
update table set status=status-1 where status>1 and id=1;