【问题标题】:Keep a table column at the earliest related value of a column in another table将表列保留在另一个表中列的最早相关值处
【发布时间】:2018-11-15 15:46:15
【问题描述】:

我有两个相关的表。让我们称他们为 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。

用例:原因是我需要经常使用first_event 上的条件查询此event_type 表,并按此字段对其进行排序以获取时间范围内的条件。

我尝试过这样的事情:

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。

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

【问题讨论】:

    标签: postgresql triggers postgresql-triggers


    【解决方案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;
    

    在同一语句中执行检查。

    【讨论】:

    • 我也应该想到这一点。也许这只是漫长的一天。谢谢你。编辑中的最终解决方案
    • 最好将您的最终解决方案作为答案发布,这样可以减少混乱。
    【解决方案2】:

    在 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();
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2012-03-13
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多