Postgresql Postgres触发器-使用两个不同的表

Postgresql Postgres触发器-使用两个不同的表,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我有两张桌子: Books - isbn (PK), title, qty-in-stock Orderlist - ordernum (PK), isbn, quantity 我的目标是在orderlist中插入一条记录,然后,如果符合ISBN,将数量添加到库存数量中 我的功能和触发器不正确- CREATE OR REPLACE FUNCTION books_upd() RETURNS trigger as $bookupd$ BEGIN --IF THE ISBN MATCHES B

我有两张桌子:

Books - isbn (PK), title, qty-in-stock
Orderlist - ordernum (PK), isbn, quantity
我的目标是在orderlist中插入一条记录,然后,如果符合ISBN,将数量添加到库存数量中

我的功能和触发器不正确-

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();

有人能帮忙吗?

由于插入和更新的情况不同,触发功能相当复杂

当用户更新订单时,功能应:

  • 如果
    ISBN
    相同或相同,则将新的
    数量和旧的
    数量之间的差异添加到
    库存数量中
  • 从一本书的
    库存数量
    中减去旧的
    数量
    ,当
    ISBN
    不同时,将新的
    数量
    添加到另一本书的
    库存数量
此外,如果给定的
isbn
书籍中不存在,则函数应拒绝更改

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;
阅读更多关于


仅用于插入的触发器功能非常简单:

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;

事实上,我把事情弄得太复杂了。很抱歉我们只有一个插入的箱子。此外,订单列表中的isbn是图书中isbn的外键。所以,它总是会被找到。我认为我们不需要你的第二个要点。你的回答很有帮助!考虑到这些简化程序,什么是新的编码?随着业务规则的发展,另一个挑战是-我发现设置qty\u in_stock=qty\u in_stock+new.quantity