【问题标题】:Postgresql: create trigger to increment count_column between two tables?Postgresql:创建触发器以在两个表之间增加 count_column?
【发布时间】:2020-10-02 23:01:00
【问题描述】:

我有一个名为car 的表和另一个名为inventory 的表。

car 有一个名为 needs_oil_change 的列(布尔值)

inventory 有一个名为oil_change_due_count INTEGER 的列

我想创建一个触发器,每当 car.oil_change_due_count 更改(或插入或删除新的汽车记录)时,该触发器将递增或递减 inventory.oil_change_due_count

所以,简而言之,我想要一个触发器来保持库存汇总计数列 oil_change_due_count 在创建/删除/更新汽车记录时保持同步。

我尝试关注一些在线文档,例如:

https://w3resource.com/PostgreSQL/postgresql-triggers.php

https://dataegret.com/2017/10/postgresqls-transition-relations/

和其他人。

我还不能创建一个有效的。

我将如何编写可以处理该逻辑的触发器?

我刚刚发现了这个:

PostgreSQL: Checking for NEW and OLD in a function for a trigger

不确定它是否会回答我的问题,但我会尝试从中学习,看看是否可以适用于我的问题。

【问题讨论】:

  • 我认为这需要carinventory 表的架构。或者至少对car.needs_oil_changeinventory.oil_change_due_count and car.oil_change_due_count. In particular whether there is field in inventory` 与car 之间的关系进行更多解释?
  • 汽车有一个inventory_id FK。库存表没有汽车 FK。因此,汽车指向库存。这就是现在的布局。

标签: postgresql


【解决方案1】:

首先你需要创建一个触发函数来处理逻辑,在postgresql中你可以这样做

CREATE OR REPLACE FUNCTION fn_oil_change() RETURNS TRIGGER AS $$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            UPDATE inventory SET oil_change_due_count = oil_change_due_count - OLD.oil_change_due_count;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            ... some logic to hangle update 
            RETURN NEW
        ELSIF (TG_OP = 'INSERT') THEN
            ... some logic to hangle update
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$$ LANGUAGE plpgsql;

然后自己创建触发器

CREATE TRIGGER tg_oil_change
AFTER INSERT OR UPDATE OR DELETE ON car
    FOR EACH ROW EXECUTE PROCEDURE fn_oil_change();

差不多是这样,现在我无法测试代码,你需要考虑如何处理更新。

【讨论】:

  • 是的,这看起来很棒。我刚刚编写了处理更新的触发器,并在数据控制中对其进行了测试。效果很好。现在,我将看看您的 DELETE 案例示例。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多