循环访问MySQL中的枚举

时间:2010-09-01 15:23:34

标签: 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;

如果不是,我相信确实应该......

2 个答案:

答案 0 :(得分:1)

这不是一个非常优雅的解决方案,但如果你没有使用严格的SQL模式,你应该能够通过2次更新来实现这一点:

1)将所有列值递增1.设置为max enum值的列将设置为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)

答案 1 :(得分:0)

您应该更喜欢使用IF()函数。您正在寻找的是一种技巧解决方案,仅在MySQL ENUMS的情况下才有效,如果枚举是按特定顺序创建的(不利于代码的可读性和可理解性。您可能必须与之共享代码)其他人有一天。)