[SQL] Inverser un champ

Fermé
-
 neemzy -
Bonjour,
j'ai un champ enum('0', '1')
dans une table il est par defaut à 0 et j'aimerais une requete qui si ce champ est à 0 le fait passer à 1 et s'il est à 1 le fait passer à 0
je pourrais passer par php pour recupérer la valeur du champs puis faire la requete en conséquence mais je prefere le faire directement avec MYSQl si c'est possible
merci d'avance

1 réponse

Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
383
Est-ce que tu peut rajouter une valeur a ton enum ? Si oui tu lui rjoute 2 et tu fais :
UPDATE maTable
SET champ=2
WHERE champ=0;
UPDATE maTable
SET champ=0
WHERE champ=1;
UPDATE maTable
SET champ=1
WHERE champ=2;
Pour ceux que cela pourrait intéresser.

Plutôt que d'utiliser un champ ENUM('0', '1') pour gérer les cas true/false avec MySQL, j'utilise un champ de type TINYINT(1) dans lequel j'envoie soit 0, soit 1.

Pour la mise à jour de la table, par exemple pour définir si un utilisateur est à l'état "accepté" ou à l'état "non accepté", j'utilise les fonctions MOD(n,m) (fonction modulo) et ABS(x) (fonction absolu) :
UPDATE user_tb SET user_estAccepte = ABS(MOD(user_estAccepte, 2) - 1) WHERE user_id = 1 OR user_id=3 OR user_id = 15;

En effet, ABS(MOD(0,2) - 1) = 1 et ABS(MOD(1,2) - 1) = 0 : on obtient "l'inverse binaire".
Si l'utilsateur 3 est accepté, il passe à l'état "non accepté" et si l'utilisateur 15 est non accepté, il passe à l'état "accepté" ... le tout dans une seule et même requête.

Bon MySQL.
> Login Art
La fonction MOD n'est pas obligatoire dans cet exemple en base 2.
UPDATE user_tb SET user_estAccepte = ABS(user_estAccepte - 1) WHERE user_id = 1 OR user_id=3 OR user_id = 15;

En effet, ABS(0 - 1) = 1 et ABS(1 - 1) = 0 : on obtient "l'inverse binaire".
Je me permets de déterrer ce topic, des fois que ça puisse servir à quelqu'un qui se pose la même question que moi aujourd'hui, à savoir comment inverser simplement un champ TINYINT(1) contenant 0 ou 1 (un champ binaire en somme) :

L'idée proposée par Login Art n'est pas mauvaise, mais même sa version simplifiée peut encore être améliorée : il est possible de faire cela sans utiliser la moindre fonction SQL, simplement en inversant l'opération. Voyez plutôt :

UPDATE user_tb SET user_estAccepte = (1 - user_estAccepte) WHERE [...]

En effet, 1 - 1 = 0 et 1 - 0 = 1. Il suffisait d'y penser... ;)