2010-09-01 13 views
1

J'ai une table dans ma base de données avec une colonne de type ENUM avec 3 valeurs:Cyclisme par énumérations dans MySQL

(« hors ligne », « en ligne », « arrivé à expiration »)

Je veux être en mesure de effectuez une mise à jour qui fait passer la valeur de cette colonne à la valeur suivante dans la liste ... et revenez au début.

à savoir

'Offline' will change to 'Online' 

'Online' will change to 'Expired' 

'Expired' will change to 'Offline' 

Je comprends qu'il ya beaucoup de façons de contourner cela, mais je ne veux pas avoir à entrer les valeurs ou le nombre total de valeurs.

Y a-t-il des fonctions intégrées pour supporter cela?

Existe-t-il une fonction qui renvoie la longueur d'un ensemble de valeurs enum? < - avec ceci une opération mod() pourrait être utilisée pour obtenir le résultat désiré.

C'est là que je suis arrivé à dans le code pseudo:

MISE À JOUR enum_tbl SET enum_col = (enum_col% count_of_poss_values) + 1;

Et sinon je crois qu'il devrait y avoir ..

Répondre

1

Ce n'est pas une solution très élégante, mais si vous n'utilisez pas SQL stricte MODE, vous devriez être en mesure de le faire avec 2 mises à jour:

1) Incrémenter toutes les valeurs de colonne de 1. Les colonnes qui ont été définies à la valeur max enum seront définies sur 0 et MySQL lancera un avertissement. 2) Ensuite, vous pouvez exécuter une deuxième mise à jour pour définir les valeurs de la colonne à 1 au lieu de 0.

Exemple:

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

Vous devriez préférer utiliser la fonction IF(). Ce que vous cherchez est une solution qui ne fonctionnera que dans le cas de MySQL ENUMS, et cela aussi, si les énumérations sont créées dans cet ordre particulier (pas bon pour la lisibilité et la compréhensibilité du code. d'autres un jour.)