【问题标题】:SQL - How can I insert into a table based on a condition?SQL - 如何根据条件插入表?
【发布时间】:2019-01-28 11:20:58
【问题描述】:

我有两个表 - 一个订单表和一个库存表。库存表跟踪 product_id、product_type 和剩余库存量。订单表跟踪 order_id、product_id 和 order_amount。 order 表通过 product_id 连接到 inventory 表。

什么是确保我永远不会收到一个订单金额超过特定 product_id 剩余库存的最佳方法?

似乎我不能将INSERT INTOWHERE 一起使用——其中我只在订单数量

【问题讨论】:

  • 收到新订单时如何更新库存?

标签: sql postgresql


【解决方案1】:

我会在订单表上添加一个触发器。该触发器将从剩余库存量中减去order_amount。这将自动计算剩余库存。

此外,我将检查剩余股票价值为>= 0。这样,您将阻止超过剩余库存的订单。插入将被回滚,因为它会违反库存检查。


CREATE FUNCTION update_inventory_amount()
  RETURNS trigger AS
$BODY$
DECLARE
BEGIN
    IF TG_OP = 'INSERT' THEN
        UPDATE
            inventory
        SET
            amount = amount - NEW.order_amount
        WHERE
            product_id = NEW.product_id;
    END IF;

    RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER update_inventory_amount_trigger
  BEFORE INSERT
  ON orders
  FOR EACH ROW
  EXECUTE PROCEDURE update_inventory_amount();

ALTER TABLE inventory ADD CONSTRAINT amount_check CHECK (amount >= 0);

以上触发代码仅针对UPDATE。稍加努力,您就可以将其扩展到还涵盖UPDATEDELETE

【讨论】:

  • 我在哪里可以对剩余库存价值进行检查?每次我更新订单表?
  • 仅一次:ALTER TABLE inventory ADD CONSTRAINT amount_check CHECK (amount > 0); 每次amount 更改时都会检查。
  • @walksignison - 查看我的更新答案。我已经添加了示例代码。
  • @walksignison 你是对的,抱歉 - 这只是快速复制粘贴,我忘了更改代码。使用NEW,您可以访问插入的orders 行中的所有字段。
  • @walksignison 如果您绝对确定只有INSERT 操作,那么确实可以删除TG_OP 条件。否则我建议覆盖orders 表上所有可能的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2012-07-08
  • 2018-03-30
  • 2015-09-27
相关资源
最近更新 更多