Держите столбец таблицы при самом раннем связанном значении столбца в другой таблице - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть две связанные таблицы. Давайте назовем их event_types и occurrences со следующими столбцами:

event_types
-------------
id VARCHAR(30)
name VARCHAR(50)
first_event Timestamp

и

occurrences
-------------
id VARCHAR(30)    
event_type_id VARCHAR(30)
timestamp Timestamp
postal_number Integer
city VARCHAR(50)
street VARCHAR(50)

Я хочу добавить триггер, который обновляет first_event в случае, если новый occurrence придет с более ранним timestamp.

Вариант использования: причина в том, что мне нужно часто запрашивать эту таблицу event_type с условиями на first_event и сортировать ее по этому полю, чтобы получить их внутри временного интервала.

Я пробовал что-то вроде этого:

CREATE OR REPLACE FUNCTION set_to_minimum_time() RETURNS TRIGGER AS
$$
    BEGIN
        IF NEW.timestamp < SELECT first_event from event_types where id=NEW.event_type_id THEN
            UPDATE event_types 
            SET first_event = NEW.timestamp
            WHERE id = NEW.event_type_id
        END IF
    END;
$$ 
LANGUAGE PLPGSQL;

CREATE TRIGGER after_trigger_time_updater
    AFTER INSERT OR UPDATE OR DELETE
    ON occurrences
    FOR EACH ROW
    EXECUTE PROCEDURE set_to_minimum_time();

Это уже сбой из-за оператора select в предложении if с синтаксической ошибкой. Так как я могу добиться такого обновления с помощью триггера?

Я использую Postgres> 9,5 и 10.

Еще одно замечание: такие обновления в случаях появления не будут появляться очень часто.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Мое окончательное решение после помощи Лоренца Альба:

CREATE OR REPLACE FUNCTION maybe_update_event_type_time() RETURNS TRIGGER   AS $maybe_update_event_type_time$
    BEGIN
        UPDATE event_types t
        SET t.first_event = NEW.timestamp
        WHERE t.id = NEW.event_type_id
          AND t.first_event > NEW.timestamp;
        RETURN NULL;
    END;
$maybe_update_event_type_time$ LANGUAGE PLPGSQL;

CREATE TRIGGER after_trigger_anomaly_time_updater
    AFTER INSERT OR UPDATE
    ON occurrences
    FOR EACH ROW
    EXECUTE PROCEDURE maybe_update_event_type_time();
0 голосов
/ 15 ноября 2018

Вы можете избежать синтаксической ошибки, поместив скобки вокруг оператора SELECT.

Но вы допустили еще одну ошибку: вы определили триггер ON DELETE, и в этом случае нет записи NEW,В любом случае не имеет смысла иметь этот триггер ON DELETE, не так ли?

Оператор SQL в триггере может быть проще:

UPDATE event_types 
SET first_event = NEW.timestamp
WHERE id = NEW.event_type_id
  AND first_event < NEW.timestamp;

Это выполняет проверку в том же порядкеутверждение.

...