【问题标题】:Update different table when row inserted插入行时更新不同的表
【发布时间】:2017-11-24 09:33:28
【问题描述】:

我正在开发一个市场平台,在该平台上,我将用户余额存储为余额变化表,并在用户行中存储预先计算的值。这让我可以轻松检查他们的余额,但仍会在特定时间间隔重新计算以确保他们保持同步。

以下是余额变化表的示例:

| id | opening_balance | closing_balance | user_id |
|----|-----------------|-----------------|---------|
| 1  | 23.40           | 28.20           | 6       |
| 2  | 14.70           | 11.10           | 79      |
| 3  | 117.12          | 107.12          | 20      |

插入新行时,我想将user_id 关系上的balance 列更新为新插入的closing_balance

根据我在网上找到的内容,我得到了以下内容,但它适用于 MySQL 而不是 Postgresql。

CREATE TRIGGER balance_update
AFTER INSERT ON balance_history
FOR EACH ROW 
BEGIN
  UPDATE users 
     SET balance = NEW.closing_balance
   WHERE id = NEW.user_id;
END;

看起来 Postgresql 要求您在创建触发器之前创建一个命名过程?不确定转换它的最佳方法。

【问题讨论】:

标签: postgresql


【解决方案1】:

Postgres 中的触发器的语法比 MySQL 复杂一点,因为它们将过程作为动作执行。在这种情况下,我们可以定义一个函数,该函数将根据插入第一个表的结果执行您想要的更新。

CREATE OR REPLACE FUNCTION your_proc()
RETURNS trigger AS
$$
BEGIN
    UPDATE users 
    SET balance = NEW.closing_balance
    WHERE id = NEW.user_id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

CREATE TRIGGER balance_update
AFTER INSERT ON balance_history
FOR EACH ROW 
EXECUTE PROCEDURE your_proc();

【讨论】:

  • @BenedictLewis 打字错误,我用 RETURN NEW 而不是 RETURN NEW;,末尾有一个分号。
  • 啊,我现在收到syntax error at or near "RETURN"
  • 我没有想法,它应该可以工作。您是否在正确的位置定义了所有内容?
  • 搞清楚是什么,表是user而不是users,所以需要引用
  • @BenedictLewis 很高兴你知道了。我认为问题会是这样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2020-04-27
  • 2010-11-11
  • 1970-01-01
  • 2019-03-23
相关资源
最近更新 更多