sql (postgres) - как создать триггер, который умножит две строки из таблицы и добавит их в другую таблицу? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть две таблицы 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();

1 Ответ

0 голосов
/ 09 сентября 2018

Ваш триггер находится в таблице orderitem, поэтому вам нужно вызвать регулярный оператор обновления внутри триггера.

Что-то в строке этого должно работать

CREATE OR REPLACE FUNCTION update_order_price() RETURNS TRIGGER
AS $update_order_price$
    DECLARE
        delta numeric(14, 2)
    BEGIN
        -- Work out the increment/decrement amount(s).
        IF (TG_OP = 'INSERT') THEN
            delta = NEW.quantity * NEW.unitprice;
        ELSIF (TG_OP = 'UPDATE') THEN
            delta = NEW.quantity * NEW.unitprice - OLD.quantity * OLD.unitprice;
        ELSIF (TG_OP = 'DELETE') THEN
            delta = - OLD.quantity * OLD.unitprice;
        END IF;

        -- Update the order row
        UPDATE orders 
        SET totalamount = totalamount + delta
        WHERE id = OLD.orderid;

        RETURN NEW;
    END;
$update_order_price$ LANGUAGE plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...