0

我有两个相关的表。让我们调用它们event_typesoccurrences使用以下列:

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以防万一新occurrencetimestamp.

用例:原因是我需要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();

由于 if 子句中的 select 语句存在语法错误,这已经失败。那么如何通过触发器实现这样的更新呢?

我正在使用 Postgres > 9.5 和 10。

进一步说明:此类事件更新不会经常出现。

4

2 回答 2

1

您可以通过在语句周围加上括号来避免语法错误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;

这将在同一语句中执行检查。

于 2018-11-15T16:14:10.717 回答
0

在 Laurenz Albe 的帮助下,我的最终解决方案:

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();
于 2018-11-16T09:39:26.707 回答