Postgres 触发器 - 使用 2 个不同的表
Postgres Trigger - Working with 2 different tables
我有 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不同
当用户更新订单时,函数应该:
- 添加到
qty_in_stock
新旧之间的差异quantities
如果isbns
相同或
- 从一本书的
qty_in_stock
中减去旧的 quantity
并在 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。
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;
我有 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不同
当用户更新订单时,函数应该:
- 添加到
qty_in_stock
新旧之间的差异quantities
如果isbns
相同或 - 从一本书的
qty_in_stock
中减去旧的quantity
并在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。
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;