如何根据另一个表的列上的条件自动更新列的值?

时间:2018-10-30 00:52:16

标签: sql postgresql sql-update

所以基本上,我正在使用Postgresql,而我想做的是: 说,我们有2个表,库存和buyList

create table inventory
(item_id serial primary key,
name text not null,
quantity int not null,
price int not null);

insert into inventory values
(1,'a',44,10000),
(2,'b',12,12000),
(3,'c',11,5000),
(4,'d',6,3000);

create table buyList
(buy_id serial primary key,
item_id not null references inventory(item_id),
quantity int not null);

insert into buyList values
(1,2,4),
(2,2,5),
(3,1,1);

所以我想让stock.quantity值减去相关项目的buyList.quantity(基于课程的item_id) 例如,如果有人买了4件商品“ a”,那么表库存中商品“ a”数量列的值将为40(自动更新)。

编辑: 非常感谢krithikaGopalakrisnan提供答案, 所以我使用了krithikaGopalakrisnan制作的触发器(并做了一些修改)

CREATE OR REPLACE FUNCTION trigger() RETURNS trigger AS $$ 
    BEGIN 

    UPDATE inventory SET quantity =  quantity-NEW.quantity WHERE inventory.item_id = NEW.item_id ;

     RETURN NEW;
    END; 
    $$ LANGUAGE plpgsql;

DO $$
DECLARE 
BEGIN
EXECUTE format('CREATE TRIGGER trigger BEFORE INSERT OR UPDATE ON buylist FOR EACH ROW  WHEN (pg_trigger_depth() = 0) EXECUTE PROCEDURE trigger()');
END;
$$ LANGUAGE plpgsql;

但是现在出现了一个新问题,当库存表(inventory.quantity)中的物料数量为0,并且在购买清单表中有该物料的新购买时,该物料的stock.quantity变为负数! (当然我们不能拥有),如何解决此问题,以便当库存表中的商品数量为0时,购买清单表不能接受另一个表示有人购买该商品的元组(也许是返回错误的函数)消息之类的东西

预先感谢,我仍然是一个新手,非常感谢你们的帮助和指导。

1 个答案:

答案 0 :(得分:1)

您需要一个触发器。

    CREATE FUNCTION trigger() RETURNS trigger AS $$ 
    BEGIN 
    UPDATE inventory SET quantity =  NEW.quantity WHERE inventory.item_id = NEW.item_id;
    RETURN NEW;
    END; 
    $$ LANGUAGE plpgsql;

DO $$
DECLARE 
BEGIN
EXECUTE format('CREATE TRIGGER trigger BEFORE INSERT OR UPDATE ON buylist FOR EACH ROW  WHEN (pg_trigger_depth() = 0) EXECUTE PROCEDURE trigger()');
 END;
$$ LANGUAGE plpgsql;


Sample data:

postgres=# select * from inventory;
 item_id | name | quantity | price 
---------+------+----------+-------
       1 | a    |       44 | 10000
       2 | b    |       12 | 12000
       3 | c    |       11 |  5000
       4 | d    |        6 |  3000
(4 rows)

postgres=# select * from buylist;
 buy_id | item_id | quantity 
--------+---------+----------
      1 |       2 |        4
      2 |       2 |        5
      3 |       1 |        1
(3 rows)

postgres=# update buylist set quantity=4 where item_id=1;

postgres=# select * from inventory;
 item_id | name | quantity | price 
---------+------+----------+-------
       2 | b    |       12 | 12000
       3 | c    |       11 |  5000
       4 | d    |        6 |  3000
       1 | a    |       40 | 10000

希望有帮助