2010-09-01 68 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的情況下才能起作用,並且,如果枚舉按特定順序創建(不利於代碼的可讀性和可理解性,您可能必須與其他有一天。)