Есть ли способ в MySQL обратить булево поле одним запросом? - PullRequest
21 голосов
/ 20 марта 2009

В моей таблице есть столбец с заголовком «разрешено». Его значение по умолчанию равно 0. Его нужно изменить на 1, когда пользователь авторизован, но его необходимо сбросить на 0. Я знаю, что я мог бы легко сделать это с помощью 2 запросов, например, так:

$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');

Что я хотел знать, есть ли способ сделать это одним запросом? Чтобы изменить логическое значение?

Ответы [ 4 ]

31 голосов
/ 20 марта 2009
UPDATE `users` SET `authorised` = NOT `authorised` WHERE id = 2

Этот запрос также работает для отмены поля и более встроен в логический синтаксис.

29 голосов
/ 20 марта 2009
UPDATE users SET `authorised` = IF (`authorised`, 0, 1)
4 голосов
/ 27 февраля 2014

Также возможно использовать XOR, если ваше 'логическое' поле реализовано как TINYINT:

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

Это установит значение «авторизованного» на 0, если в данный момент 1, и на 1, если в настоящий момент 0. Это также обнулит все ненулевые значения, поэтому является идеальным решением, если вы (как и я) используете несколько положительных значений для Разнообразие уровней «включено», но всегда нужно возвращаться к 0, когда «выключено».

4 голосов
/ 20 марта 2009

Есть несколько способов сделать это, вот простой:

UPDATE users SET authorised = ABS(authorised - 1) WHERE id = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...