gpt4 book ai didi

postgresql - Postgres 触发器 - 使用 2 个不同的表

转载 作者:行者123 更新时间:2023-11-29 11:36:53 26 4
gpt4 key购买 nike

我有 2 个表:

Books - isbn (PK), title, qty-in-stock
Orderlist - ordernum (PK), isbn, quantity

我的目标是向订单列表中插入一条记录,然后,如果匹配 isbns,则将数量添加到库存数量

我的函数和触发器不正确-

CREATE OR REPLACE FUNCTION books_upd() RETURNS trigger as $bookupd$
BEGIN
--IF THE ISBN MATCHES BETWEEN BOOKS AND ORDERLIST
-- ADD THE EXISTING QTY_IN_STOCK (BOOKS) TO QUANTITY (ORDERLIST)
QTY_IN_STOCK:=QTY_IN_STOCK+QUANTITY;
--END IF
RETURN NEW;
$bookupd$ LANGUAGE plpgsql;

CREATE TRIGGER books_upd
BEFORE INSERT OR UPDATE on orderlist
FOR EACH ROW
EXECUTE PROCEDURE books_upd();

有人能帮忙吗?

最佳答案

由于insert和update的case不同,触发函数比较复杂。

当用户更新订单时,函数应该:

  • 如果 isbns 相同或
  • ,将新旧 数量之间的差异添加到 qty_in_stock
  • 从一本书的 qty_in_stock 中减去旧的 quantity 并将新的 quantity 添加到另一本书的 qty_in_stock isbns 不同。

此外,如果给定的 isbnbooks 中不存在,该函数应该拒绝更改。

CREATE OR REPLACE FUNCTION books_upd() 
RETURNS trigger as $bookupd$
DECLARE
v_quantity int;
BEGIN
v_quantity = NEW.quantity;
IF TG_OP = 'UPDATE' THEN
IF OLD.isbn != NEW.isbn THEN
UPDATE books
SET qty_in_stock = qty_in_stock- OLD.quantity
WHERE isbn = OLD.isbn;
ELSE
v_quantity = NEW.quantity- OLD.quantity;
END IF;
END IF;

UPDATE books
SET qty_in_stock = qty_in_stock+ v_quantity
WHERE isbn = NEW.isbn;

IF NOT FOUND THEN
RAISE EXCEPTION 'Uknown isbn';
END IF;
RETURN NEW;
END;
$bookupd$ LANGUAGE plpgsql;

阅读更多关于 NEW, OLD and TG_OP 的信息.


insert的触发函数很简单:

CREATE OR REPLACE FUNCTION books_upd() 
RETURNS trigger as $bookupd$
BEGIN
UPDATE books
SET qty_in_stock = qty_in_stock+ NEW.quantity
WHERE isbn = NEW.isbn;

RETURN NEW;
END;
$bookupd$ LANGUAGE plpgsql;

关于postgresql - Postgres 触发器 - 使用 2 个不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34003447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com