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

Тип a -> Integer на самом деле не означает «функцию от любого типа до Integer», как вы ее описываете. Когда определение или выражение имеет тип a -> Integer, это означает, что для любого типа T можно специализировать или создавать экземпляр этого определения или выражения в функции типа T -> Integer.

Слегка переключая нотацию, можно подумать, что foo :: forall a. a -> Integer действительно является функцией двух аргументов: типа a и значения этого типа a. Или, с точки зрения карри, foo :: forall a. a -> Integer - это функция, которая принимает тип T в качестве аргумента и производит для этого специализированную функцию типа T -> Integer T. Используя функцию тождества в качестве примера (функция, которая создает свой аргумент в качестве своего результата), мы можем продемонстрировать это следующим образом:

-- | The polymorphic identity function (not valid Haskell!)
id :: forall a. a -> a
id = \t -> \(x :: t) -> x

Эта идея реализации полиморфизма как аргумента типа для полиморфной функции исходит из математическая структура, называемая System F , которую Хаскелл фактически использует в качестве одного из своих теоретических источников. Однако Haskell полностью скрывает идею передачи параметров типа в качестве аргументов функциям.

11
задан John Saunders 18 June 2009 в 14:44
поделиться

7 ответов

UPDATE `table`
SET `inuse` = (`id` = 23)
22
ответ дан 3 December 2019 в 02:02
поделиться

Конечно

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

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

12
ответ дан 3 December 2019 в 02:02
поделиться

Я не знаю лучших , но вы можете посмотреть Ragel :

Ragel компилирует исполняемые конечные автоматы из обычных языков. Ragel нацелен на C, C ++, Objective-C, D, Java и Ruby.

1
ответ дан 3 December 2019 в 02:02
поделиться
UPDATE myTable
SET Field = 0
WHERE FieldID <> [WhateverID]

UPDATE myTable 
SET Field = 1
WHERE FieldId = [WhateverID]
0
ответ дан 3 December 2019 в 02:02
поделиться

Попробуйте

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

или короче

update tbl set inuse = test;

, например

update tbl set inuse = name = 'foo';
0
ответ дан 3 December 2019 в 02:02
поделиться

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

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

UPDATE myTable
SET InUse = CASE
   WHEN myTable.id = @id THEN 1
   ELSE 0
END
0
ответ дан 3 December 2019 в 02:02
поделиться

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

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

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

0
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: