【问题标题】:Postgresql : Achieve check constraint on aggregated SUMPostgresql:实现对聚合 SUM 的检查约束
【发布时间】:2019-08-22 20:09:47
【问题描述】:

所以我有这个库存数据库

https://dbfiddle.uk/?rdbms=postgres_10&fiddle=19946dda5ca1ab86e9a8cf63717e65fa

哪个或多或少地添加了来自各种来源的库存 (inventory_type) 并将具有 products(id) 外键引用。总和将据此计算。

谓词应该是

如果股票价值是负数,那么它不应该大于股票本身。

您建议我如何实现它?

这是我尝试过的。

检查不允许子查询,所以我选择了触发器。

 CREATE FUNCTION public.check_stock_quantity()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
AS $BODY$
BEGIN
   IF NEW.stock < 0 THEN
       IF ((SELECT SUM(stock) FROM inventory WHERE id= NEW.id) - NEW.stock ) < 0 THEN
            RAISE EXCEPTION 'Not enough stocks. Invalid stock entry';
        END IF;
   END IF;

   RETURN NEW;
END;
$BODY$;

然后我应用了它

stock_trigger BEFORE INSERT OR UPDATE ON inventory FOR EACH ROW EXECUTE PROCEDURE check_stock_quantity()

但它拒绝工作。

有没有更好的方法来处理这样的库存?如果不是,那么我的触发器有什么问题?

【问题讨论】:

  • 在什么情况下不起作用?具体一点。
  • 编辑 :- 成功了

标签: sql postgresql triggers aggregate-functions


【解决方案1】:

首先,应将新库存添加到表中的库存总和中(而不是从中减去)。接下来,您可能是指pid 作为分组列,因为id 是主键。所以函数体应该是这样的:

    IF NEW.stock < 0 THEN
        IF ((SELECT SUM(stock) FROM inventory WHERE pid= NEW.pid) + NEW.stock ) < 0 THEN
            RAISE EXCEPTION 'Not enough stocks. Invalid stock entry';
        END IF;
    END IF;

    RETURN NEW;

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2016-11-13
    • 1970-01-01
    • 2011-07-09
    • 2017-03-19
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多