我的数据库中有一个包含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;
如果不是,我相信确实应该......
答案 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的情况下才有效,如果枚举是按特定顺序创建的(不利于代码的可读性和可理解性。您可能必须与之共享代码)其他人有一天。)