2009-03-20 24 views
21

Tengo una columna en mi tabla titulada 'autorizada'. Su valor por defecto es 0. Se necesita ser cambiado a 1 cuando el usuario está autorizado, pero tiene que ser capaz de poner a 0 Sé que podría hacerlo fácilmente con 2 consultas de este modo:¿Hay alguna manera en MySQL de invertir un campo booleano con una consulta?

$authorised = Db::query('SELECT authorised FROM users WHERE id=2'); 

$newAuthValue = ($authorised['authorised']) ? 0 : 1; 

Db::query('UPDATE users SET authorised=' . $newAuthValue . ' WHERE id=2'); 

Lo Quería saber, ¿hay alguna manera de hacer esto con una consulta? Para revertir un valor booleano?

Respuesta

27
UPDATE users SET `authorised` = IF (`authorised`, 0, 1) 
+0

Esto se ve más limpio IMO. :) – alex

+0

Solo asegúrate de agregar tu cláusula where, alex. –

+0

@Peter, gracias, y sí lo hice. – alex

4

Existen múltiples maneras de hacer esto, aquí es simple:

UPDATE users SET authorised = ABS(authorised - 1) WHERE id = 2; 
+0

Whoops, se perdió eso. Gracias Chad. – alex

+4

¿por qué no solo "1 - autorizado"? – nickf

+1

@nickf: estoy de acuerdo con usted, lo siguiente debería funcionar: ACTUALIZAR usuarios SET autorizado = 1 - autorizado DONDE id = 2; – dalle

30
UPDATE `users` SET `authorised` = NOT `authorised` WHERE id = 2 

Esta consulta también funcionará para negar el campo, y es más en línea con la sintaxis booleana.

+0

Ok, eso no se publicó correctamente, esas barras deberían ser backticks, que son los encapsuladores por defecto de MySQL. –

+0

¡Esa es una buena ...! +1 – alex

+1

SET autorizado =! Autorizado –

4

También es posible utilizar XOR si el campo 'booleano' se implementa como un TINYINT:

UPDATE users SET authorised = authorised XOR 1 WHERE id = 2; 

Esto establecerá 'autorizado' a 0 si actualmente 1, y en 1 si actualmente 0. Será también pone a cero todos los valores que no sean cero, por lo que es una solución ideal si (como yo) usa varios valores positivos para reflejar una variedad de niveles "en", pero siempre necesita volver a 0 cuando está "apagado".

Cuestiones relacionadas