mysql - 在 MySQL 中循环遍历枚举

标签 mysql enums iteration

我的数据库中有一个表,其中有一个包含 3 个值的枚举列:

('离线', '在线', '已过期')

我希望能够进行更新,将此列的值循环到列表中的下一个值...然后回到开头。

 'Offline' will change to 'Online'

 'Online' will change to 'Expired'

 'Expired' will change to 'Offline'

我知道有很多方法可以解决这个问题,但我不想输入值或值的总数。

有没有内置函数支持这个??

是否有返回枚举值集长度的函数? <-- 有了这个,可以使用 mod() 操作来实现所需的结果。

这是我用伪代码到达的地方:

UPDATE enum_tbl SET enum_col = (enum_col % count_of_poss_values) + 1;

如果没有,我相信真的应该......

最佳答案

这不是一个非常优雅的解决方案,但如果您不使用严格的 SQL 模式,您应该能够通过 2 次更新来完成此操作:

1) 将所有列值递增 1。设置为最大枚举值的列将设置为 0,MySQL 将发出警告。 2) 然后您可以执行第二次更新以将这些列值设置为 1 而不是 0。

例子:

mysql> create table my_table (
    -> id int not null primary key auto_increment,
    -> enum_column enum ('Offline', 'Online', 'Expired')
    -> );
Query OK, 0 rows affected (0.25 sec)

mysql> 
mysql> \W
Show warnings enabled.
mysql> insert into my_table (enum_column) values ('Offline'), ('Online'), ('Expired');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> 
mysql> select * from my_table;
+----+-------------+
| id | enum_column |
+----+-------------+
|  1 | Offline     |
|  2 | Online      |
|  3 | Expired     |
+----+-------------+
3 rows in set (0.00 sec)

mysql> 
mysql> update my_table set enum_column = enum_column+1;
Query OK, 3 rows affected, 1 warning (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 1

Warning (Code 1265): Data truncated for column 'enum_column' at row 3
mysql> update my_table set enum_column = 1 where enum_column = 0;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> 
mysql> select * from my_table;
+----+-------------+
| id | enum_column |
+----+-------------+
|  1 | Online      |
|  2 | Expired     |
|  3 | Offline     |
+----+-------------+
3 rows in set (0.00 sec)

关于mysql - 在 MySQL 中循环遍历枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619650/

相关文章:

php - 每周执行一次 php 代码,但随机一天

mysql - 内连接 SQL 语法

javascript - 如何按日期对数组中的项目进行分组?

python - 以特定方式组合数组元素并记录它

python - 我正在使用 excel 来构建网站 - 正在寻找替代方案

php - 如何通过mysql删除wordpress中没有特色图片的帖子?

java - 默认枚举方法

c - 为什么我不能使用 #if 比较宏和枚举?

java - 如何将枚举类型存储为小写字符串?

c# - 如何在 C# 中迭代​​时修改或删除可枚举集合中的项目