Я создал запрос postgres, который вставляет серию уникальных кодов. Если один код является дубликатом, я запускаю следующее.
ON CONFLICT ON CONSTRAINT uniquecode DO NOTHING;
То, что я хочу сделать вместо NOTHING
, это "counter" = "counter" - 1;
, потому что в моем цикле while значение "counter" всегда увеличивается на 1. Если есть дубликат, я хочу уменьшить его, так что если я передам 10 как количество сгенерированных кодов, то он всегда будет возвращать 10 уникальных кодов вместо 9 иногда, потому что один был дубликатом.
Однако при замене DO NOTHING
или NOTHING
на уменьшение счетчика я получаю следующую ошибку.
syntax error at or near "count"
Что это за синтаксическая ошибка. Все примеры, которые я видел онлайн, показывают обновления таблицы. Можно ли вместо этого просто обновить переменную?
По ссылке, опубликованной @a_horse_with_no_name, я пытался применить нижеприведенное после конфликта.
ON CONFLICT ON CONSTRAINT uniquecode DO UPDATE SET "created_at" = NOW();
PERFORM * FROM (
SELECT c."created_at"
FROM "codes" as c
ORDER BY "created_at" DESC
LIMIT 1
) AS "newest";
IF ("newest"::xmax::text::int > 0) THEN
"counter" = "counter" - 1;
END IF;
Смысл вышеизложенного состоит в том, что я уменьшаю счетчик, только если xmax больше нуля, что означает, что он был обновлен, а не вставлен. Если обновлено, то это означает, что "creat_at" был изменен в конфликте, иначе ничего не делать.
В настоящее время я нахожусь в точке, где, если я продолжу вызов PERFORM, тогда либо "type" xmax does not exist
, либо "column" xmax does not exist
.