Есть ли эффективный способ обновить поле выбора строк до 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.