2015-11-30 27 views
3

工作,我有2個表:Postgres的觸發 - 2頁不同的表

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

誰能幫助?

回答

1

由於插入和更新的不同情況,觸發器功能相當複雜。

當用戶更新訂單,則函數應該:

  • 添加到qty_in_stock新老quantities如果isbns相同或
  • 減去舊quantity從一本書的qty_in_stock之間的差異當isbns不同時,將另一本書的新quantity添加到qty_in_stock

此外,如果給定的isbn不存在於books中,則該函數應拒絕更改。

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


只對插入的觸發功能是非常簡單的:

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; 
+0

其實,我做這個太複雜了。抱歉! 我們只會有一個插入案例。 另外,來自訂單列表的isbn是書籍中的isbn的外鍵。所以,它會一直被找到。 我不相信我們需要你的第二個要點。 您的回答非常有幫助!鑑於這些簡化器,什麼是新編碼? – knight

+0

查看編輯答案。 – klin

+0

隨着商業規則的發展而產生的額外挑戰 我發現 SET qty_in_stock = qty_in_stock + NEW.quantity – knight