所以基本上,我正在使用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时,购买清单表不能接受另一个表示有人购买该商品的元组(也许是返回错误的函数)消息之类的东西
预先感谢,我仍然是一个新手,非常感谢你们的帮助和指导。
答案 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
希望有帮助