在列中添加新值时PostgreSQL触发器更新平均值和计数

dgjrabp2  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(1)|浏览(113)

这是我的table

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;
5f0d552i

5f0d552i1#

1.正确地转义你的触发器主体。使用美元报价
1.从函数中删除float参数
1.实际在函数中执行更新
1.更新正确的表(您正在更新示例中的nb_score表,该表上没有触发器,因此它不会触发触发器)
1.指定marknb_score之间的关系。到目前为止,下面的触发器函数更新所有nb_score行,而不仅仅是与mark中插入的行相关的行。
1.您的函数返回类型必须为触发器

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

相关问题