#sql #postgresql
#sql #postgresql
Вопрос:
Мне нравится создавать операцию сравнения и замены, чтобы ее можно было включить в пакетную транзакцию, где, если оператор cas завершается с ошибкой, остальные операторы также завершатся с ошибкой.
Этот оператор будет обновляться, если время есть 0
, но не выдает ошибку, если время нет 0
:
UPDATE account
SET time = '1'
WHERE id = (
SELECT id FROM account WHERE id = 'id-0' and time = '0' LIMIT 1
) RETURNING id
Я хочу добавить что-то вроде этого
IF NO DATA THEN
RAISE EXCEPTION 'cas ';
END IF;
но не уверен, как это сделать.
Комментарии:
1. Вы могли бы сделать это довольно легко, например, из функции plpgsql. Я не знаю, можете ли вы найти способ с помощью простого запроса…
2. Я не вижу проблемы. Проверьте результат запроса, чтобы узнать, сколько строк было обновлено, и выдайте ошибку, если ее не было.
Ответ №1:
Если вы по какой-либо причине не можете использовать блок plpgsql, вы можете принудительно выполнить деление на ноль:
UPDATE account
SET time = '1'
WHERE id = (
SELECT id FROM account WHERE id = 'id-0' and time = '0' LIMIT 1
)
AND 1/(select count(*) from account where id = 'id-0' and time = '0') is not null
RETURNING id;
Это все равно, что остановить велосипед, на котором я еду, вставив палку в спицы переднего колеса.
Комментарии:
1. как мне написать блок plpgql?
Ответ №2:
Это работает для меня:
DO $$
DECLARE
v_id TEXT;
BEGIN
UPDATE "account"
SET (id, name) = ('t1', 'world')
WHERE id = ( SELECT id FROM "account" WHERE "id" = 't1' AND "name" = 'hello' LIMIT 1)
RETURNING id INTO v_id;
IF count(v_id) = 0
THEN RAISE EXCEPTION 'Cas Error for (account, t1)';
END IF;
END $$