MySQL: обновление всех строк с установкой поля в 0, но установка поля одной строки в 1 - PullRequest
11 голосов
/ 18 июня 2009

Есть ли эффективный способ обновить поле выбора строк до 0, но установить одну из этих строк в 1 на основе идентификатора.

По сути, у меня есть несколько объектов в базе данных, и я хочу переключаться между тем, какой из них «используется», поэтому запрос установит одну из строк (по идентификатору) в значение inuse = 1, а остальные в значение inuse = 0. .

Спасибо:)

Ответы [ 7 ]

22 голосов
/ 18 июня 2009
UPDATE `table`
SET `inuse` = (`id` = 23)
11 голосов
/ 18 июня 2009

Sure

UPDATE table SET inuse=IF(id=ABCD, 1, 0)

установит для поля ввода значение 1, если id равно ABCD, и 0 в противном случае.

1 голос
/ 18 июня 2009
UPDATE  table
SET     inuse = (id = @id)
WHERE   id = @id
        OR inuse

Это обновит только релевантные строки.

0 голосов
/ 18 июня 2009

, если ваша база данных использует транзакции, это лучший способ сделать это:

update myTable set inuse = 0;
update myTable set inuse = 1 where id = ?;

если вы не используете транзакции, тогда другой ответ с использованием CASE - лучший вариант, поскольку он переносимый. но это потребует больше процессорного времени, чем два оператора UPDATE.

0 голосов
/ 18 июня 2009

Если вы хотите установить флаг, чтобы никакая другая часть кода не использовала этот же объект в одно и то же время, лучше, если вызывающий код устанавливает inuse = 1 и сбрасывает его по завершении. В противном случае вы закончите одним потоком, чтобы пометить объект (строку) как использованный, а затем, если другому потоку понадобится другой объект, он сбросит первый, пока он еще используется.

Если это не так, и вы просто хотите настроить использование одного и сбросить все остальные, вы можете использовать:

UPDATE myTable
SET InUse = CASE
   WHEN myTable.id = @id THEN 1
   ELSE 0
END
0 голосов
/ 18 июня 2009

Попробуйте

update tbl set inuse = if(test, 1, 0);

или короче

update tbl set inuse = test;

например

update tbl set inuse = name = 'foo';
0 голосов
/ 18 июня 2009
UPDATE myTable
SET Field = 0
WHERE FieldID <> [WhateverID]

UPDATE myTable 
SET Field = 1
WHERE FieldId = [WhateverID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...