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

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

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

Благодаря 🙂

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

Конечно

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

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

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

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

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

Пытаться

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

или короче

 update tbl set inuse = test; 

например

 update tbl set inuse = name = 'foo'; 

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

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

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

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

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

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