【问题标题】:PostgreSQL trigger update average and count when new value in column is added添加列中的新值时,PostgreSQL 触发更新平均值和计数
【发布时间】:2023-01-28 22:22:47
【问题描述】:

这是我的桌子:

CREATE TABLE mark (
EID serial,
PID integer,
SID integer,
score integer DEFAULT 5 NOT NULL,
CONSTRAINT PK_EID PRIMARY KEY(EID),
CONSTRAINT "FK_personne_ID"
FOREIGN KEY (PID)
REFERENCES personne (PID)
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT "FK_serie_ID"
FOREIGN KEY (SID)
REFERENCES serie (SID)
ON UPDATE RESTRICT ON DELETE RESTRICT
);

我的触发器:当在“分数”列中插入新行/值时,更新平均分数和总分数: 我不确定我是应该提前实现一个功能还是直接从触发器开始:

CREATE OR REPLACE FUNCTION FunctionUpdateScore(float) RETURNS integer AS 
'BEGIN
SELECT COUNT(score) AS nb_score, AVG(score) AS ag_score 
FROM mark;
END;'
LANGUAGE 'plpgsql';

--trigger
CREATE or REPLACE TRIGGER TriggerUpdateScore
AFTER INSERT 
ON mark
FOR EACH ROW
EXECUTE PROCEDURE FunctionUpdateScore();
UPDATE nb_score
SET nb_score= nb_score+ 1
END;

【问题讨论】:

  • 你需要做的是先阅读Create triggerplpgsql trigger function
  • 谢谢 Adrian,阅读了很多博客和帖子,但我的触发器仍然不起作用:
  • CREATE OR REPLACE TRIGGER TriggerUpdateScore AFTER INSERT ON evaluation FOR EACH ROW BEGIN UPDATE serie s SET noteMoyenne = (NoteMoyenne*nbNotes + :new.note) / (nbNotes + 1), nbNotes = nbNotes + 1 WHERE :new.sid = s.sid 复制代码;结尾;
  • 阅读链接,您就会知道自己做错了什么。

标签: sql postgresql triggers plpgsql


【解决方案1】:
  1. 正确退出你的扳机主体。使用dollar quoting
  2. 从您的函数中删除浮点参数
  3. 实际在您的函数中执行更新
  4. 更新正确的表(您正在更新示例中的 nb_score 表,该表没有触发器,因此不会触发触发器)
  5. 指定marknb_score 之间的关系。到目前为止,下面的触发器函数更新了所有nb_score 行,而不仅仅是与mark 中插入的行相关的行;
  6. 您的函数返回类型必须是触发器
    CREATE OR REPLACE FUNCTION FunctionUpdateScore() RETURNS trigger AS $$
    BEGIN
     UPDATE nb_score
        SET 
            nb_score=COUNT(score),
            ag_score=AVG(score)
        FROM mark;
    END;
    $$ LANGUAGE 'plpgsql';
    
    CREATE TRIGGER TriggerUpdateScore
    AFTER INSERT ON mark FOR EACH ROW EXECUTE PROCEDURE FunctionUpdateScore();
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多