2010-09-01 99 views
1

我有我的数据库中的表与3个值的枚举列:骑自行车通过枚举在MySQL

(“离线”,“在线”,“已过期”)

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

'Offline' will change to 'Online' 

'Online' will change to 'Expired' 

'Expired' will change to 'Offline' 

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

是否有任何内置函数来支持这个?

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

这是我在伪代码得:

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

如果不相信有真的应该..

回答

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) 
0

你应该更喜欢使用的IF()函数。你正在寻找的是一种绝妙的解决方案,只有在MySQL ENUMS的情况下才能起作用,并且,如果枚举按特定顺序创建(不利于代码的可读性和可理解性,您可能必须与其他有一天。)