Перемещение по перечислениям в MySQL - PullRequest
1 голос
/ 01 сентября 2010

В моей базе данных есть таблица со столбцом enum с 3 значениями:

(«Не в сети», «Онлайн», «Срок действия истек»)

Я хочу сделать этообновление, которое циклически изменяет значение этого столбца до следующего значения в списке ... и переносит его на начало.

т.е.

 'Offline' will change to 'Online'

 'Online' will change to 'Expired'

 'Expired' will change to 'Offline'

Я понимаю, что есть много способовчтобы обойти это, но я не хочу вводить значения или общее количество значений.

Существуют ли какие-либо встроенные функции для поддержки этого?

Есть ли функциячто возвращает длину набора значений перечисления ??<- с этим операция mod () может использоваться для достижения желаемого результата. </p>

Вот где я попал в псевдокоде:

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

А если нет, то я верю, что действительно должно быть ..

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Это не очень элегантное решение, но если вы не используете строгий режим SQL, вы сможете сделать это с 2 обновлениями:

1) Увеличьте все значения столбцов на 1. Для столбцов, для которых установлено максимальное значение 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)
0 голосов
/ 13 марта 2011

Вы должны предпочесть использование функции IF (). То, что вы ищете, это хитрое решение, которое будет работать только в случае MySQL ENUMS, и это также, если перечисления создаются в этом конкретном порядке (не подходит для читабельности и понятности кода. Возможно, вам придется поделиться кодом с другие когда-нибудь.)

...