SQL函数,插入数据时在另一个表上减去变量

SQL函数,插入数据时在另一个表上减去变量,sql,database,postgresql,sql-function,Sql,Database,Postgresql,Sql Function,我有一个关系数据库: 检查(检查ID,检测到的疾病,姓名) 使用(ReagentID,检查ID,ReagentQuantity) 试剂(ReagentID,名称,库存,最小允许库存) 已检查(保险编号、检查ID、检查日期、结果、检查结果?) 我想创建一个函数,当添加一个新的“已检查”记录时,检查使用的试剂量将从“试剂.库存”中减去。当试剂.minimumPermissibleStock低于stock时,也会返回警告消息 对于问题的第二部分,我尝试了以下方法,但不起作用: create funct

我有一个关系数据库:

检查(检查ID,检测到的疾病,姓名)

使用(ReagentID检查ID,ReagentQuantity)

试剂(ReagentID,名称,库存,最小允许库存)

已检查(保险编号、检查ID、检查日期、结果、检查结果?)

我想创建一个函数,当添加一个新的“已检查”记录时,检查使用的试剂量将从“试剂.库存”中减去。当试剂.minimumPermissibleStock低于stock时,也会返回警告消息

对于问题的第二部分,我尝试了以下方法,但不起作用:

create function warning() returns trigger AS $warning$
    begin
       if reagent.new.stock < reagent.minimumPermissibleStock then
        raise exception 'Probably mistake';
       end if;
    return new;
    end;
$warning$ LANGUAGE plpgsql;

触发器只能在其所连接的表/视图上操作——因此出现了错误(我假设您创建了触发器作为已检查的表/视图的后更新)

要真正解决这个问题,您要做的是创建一个事务来表示整个操作集,然后在更新后将上述函数作为触发器附加到试剂

例如:

CREATE FUNCTION log_examination(int reagentID, int reagentQuantity) AS $$
BEGIN
  BEGIN;
    examID := INSERT INTO Examination VALUE("disease1", "name") RETURNING ExaminationID;
    INSERT INTO Uses VALUE(reagentID, examID, reagentQuantity);
    UPDATE Reagent SET Stock = Stock - reagentQuantity WHERE ReagentID = reagentID;
  COMMIT;
END;
$$ LANGUAGE plpgsql;


为了将来的参考,请包括您正在使用的Postgres版本。@danieltahara查看我的编辑谢谢您的帮助,我一回到工作场所就会试用!!
CREATE FUNCTION log_examination(int reagentID, int reagentQuantity) AS $$
BEGIN
  BEGIN;
    examID := INSERT INTO Examination VALUE("disease1", "name") RETURNING ExaminationID;
    INSERT INTO Uses VALUE(reagentID, examID, reagentQuantity);
    UPDATE Reagent SET Stock = Stock - reagentQuantity WHERE ReagentID = reagentID;
  COMMIT;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER validate_quantity AFTER UPDATE OF Stock ON Reagent EXECUTE PROCEDURE warning();