pg SQL - функция запуска перед INSERT проверяет, существует ли запись с таким же идентификатором - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть задача: перед INSERT проверить, существует ли запись с тем же идентификатором, чтобы установить для новой записи time_dead ()

BEGIN
IF NEW.id = OLD.id THEN
         INSERT INTO temporary_objects(OLD.time_dead)
         value(now());
    END IF;
    RETURN NEW;
END;

Это не работает, так как OLD и INSERT не работают все вместе. Но я не вижу альтернативы. Спасибо.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете справиться с этой ситуацией двумя способами:

  1. Вы можете использовать INSERT или UPDATE, если у вас есть первичный ключ, определенный в столбце id таблицы: https://www.postgresql.org/docs/current/sql-insert.html
INSERT INTO temporary_objects VALUES(NEW.*) ON CONFLICT DO UPDATE SET time_dead = now();
Вы можете поместить logi c в триггер, чтобы найти строку с NEW.id, если NEW.id не существует, ВСТАВИТЬ новую запись, иначе ОБНОВИТЬ. Нечто похожее на приведенное ниже:
   DECLARE
      id_exists INTEGER;
   BEGIN
     SELECT id INTO id_exists FROM temporary_objects WHERE id = NEW.id;
     IF NOT FOUND THEN
        INSERT INTO temporary_objects VALUES(NEW.*);
     ELSE 
         UPDATE temporary_objects SET time_dead = now() WHERE id = NEW.id;
         RETURN NEW;
     END IF;
     RETURN NEW;
END;
...