MySQL: обновление всех строк, задающих поле, равным 0, но установив одно поле строки в 1

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

В принципе, у меня есть несколько объектов в базе данных, и я хочу переключиться между тем, какой из них "inuse", поэтому запрос установит одну из строк (по id) в inuse = 1, а остальные - inuse = 0.

Спасибо:)

Ответ 1

UPDATE `table`
SET `inuse` = (`id` = 23)

Ответ 2

Конечно,

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

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

Ответ 3

UPDATE  table
SET     inuse = (id = @id)
WHERE   id = @id
        OR inuse

Это обновит только соответствующие строки.

Ответ 4

UPDATE myTable
SET Field = 0
WHERE FieldID <> [WhateverID]

UPDATE myTable 
SET Field = 1
WHERE FieldId = [WhateverID]

Ответ 5

Try

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

или короче

update tbl set inuse = test;

например

update tbl set inuse = name = 'foo';

Ответ 6

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

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

UPDATE myTable
SET InUse = CASE
   WHEN myTable.id = @id THEN 1
   ELSE 0
END

Ответ 7

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

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

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