Postgres `ON CONFLICT` обновляет переменную вместо TABLE, синтаксическая ошибка в или около" " - PullRequest
0 голосов
/ 27 августа 2018

Я создал запрос 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.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018
GET DIAGNOSTICS "found" = ROW_COUNT;
IF ("found" = true) THEN "count" = "count" + 1; END IF;

Вышесказанное решило мою проблему. Он проверяет, было ли изменение в предыдущем блоке кода, если нет, то не обновляется.

0 голосов
/ 27 августа 2018

Вы можете использовать:

ON CONFLICT ON CONSTRAINT uniquecode
DO UPDATE SET count = youtable.column - 1
...