У меня есть две таблицы OrderItem и Orders. Я хотел обновить строку totalamount в таблице Orders для каждой вставки в OrderItem, умножив количество и цену за единицу. Однако я не смог создать правильный триггер. Как я могу создать триггер. Заранее спасибо!
вот моя таблица заказов:
CREATE TABLE public.orders
(
orderid integer NOT NULL DEFAULT nextval('orders_orderid_seq'::regclass),
ordernumber integer NOT NULL,
customerid integer NOT NULL,
totalamount numeric(12,4) NOT NULL,
orderdate timestamp without time zone DEFAULT now(),
CONSTRAINT orders_pk PRIMARY KEY (orderid),
CONSTRAINT orders_fk FOREIGN KEY (customerid)
REFERENCES public.customer (customerid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
)
и вот мой стол Orderitem:
CREATE TABLE public.orderitem
(
orderitemid integer NOT NULL DEFAULT nextval('orderitem_orderitemid_seq'::regclass),
orderid integer NOT NULL,
productid integer NOT NULL,
unitprice numeric(12,4) NOT NULL DEFAULT 0,
quantity integer NOT NULL,
CONSTRAINT orderitem_pk PRIMARY KEY (orderitemid),
CONSTRAINT orderitem_fk_order FOREIGN KEY (orderid)
REFERENCES public.orders (orderid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT orderitem_fk_product FOREIGN KEY (productid)
REFERENCES public.product (productid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.orderitem
OWNER TO postgres;
-- Trigger: unitprice on public.orderitem
-- DROP TRIGGER unitprice ON public.orderitem;
CREATE TRIGGER unitprice
AFTER INSERT
ON public.orderitem
FOR EACH ROW
EXECUTE PROCEDURE public.transferunitprice();
и триггерная функция, которую я пробовал:
CREATE OR REPLACE FUNCTION public.increment_totalamount()
RETURNS trigger AS
$BODY$
BEGIN
SELECT Orderitem.unitprice * Orderitem.quantity + Orders.totalamount
INTO NEW.totalamount
FROM Orderitem, Orders
WHERE Orders.orderid = NEW.orderid;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql
Я забыл добавить сам триггер:
CREATE TRIGGER increment_totalamount
BEFORE INSERT
ON public.orderitem
FOR EACH ROW
EXECUTE PROCEDURE public.increment_totalamount();