I need some help in Trigger

Asked

Viewed 36 times

0

So folks I’m needing a little help on some Mysql activities related to Trigger, basically it’s three Trigger.

First Trigger should work after an update or Insert(something I’ll still put) the product stock should change to the quantity purchased. But it ends up changing the stock of all products, I know it’s a simple logic but I’m not getting it.

The second should be every sale the stock should decrease where the logic does not work completely yet

And finally the last would be if a purchase is deleted and if you have sufficient quantity in stock should be decreased, if it has not be canceled.

DROP DATABASE IF EXISTS DBPEDIDO;
CREATE DATABASE DBPEDIDO;

USE DBPEDIDO;

CREATE TABLE PRODUTO (
    IDPRODUTO INT NOT NULL AUTO_INCREMENT
    , NOME VARCHAR(45)
    , ESTOQUE INT
    , PRIMARY KEY(IDPRODUTO)
);

CREATE TABLE COMPRA (
    IDCOMPRA INT NOT NULL AUTO_INCREMENT
    , IDPRODUTO INT NOT NULL
    , QTDE INT
    , PRECOUNITARIO NUMERIC(8,2)
    , PRIMARY KEY (IDCOMPRA)
    , FOREIGN KEY (IDPRODUTO) REFERENCES PRODUTO(IDPRODUTO)
);

CREATE TABLE VENDA (
    IDVENDA INT NOT NULL AUTO_INCREMENT
    , IDPRODUTO INT NOT NULL
    , QTDE INT
    , PRECOUNITARIO NUMERIC(8,2)
    , PRIMARY KEY (IDVENDA)
    , FOREIGN KEY (IDPRODUTO) REFERENCES PRODUTO(IDPRODUTO)
);

INSERT INTO PRODUTO(IDPRODUTO, NOME, ESTOQUE) VALUES(NULL, 'COLHER', 1);
INSERT INTO COMPRA(IDCOMPRA, IDPRODUTO, QTDE, PRECOUNITARIO) VALUES(NULL, 1, 452, 1);
INSERT INTO VENDA(IDVENDA, IDPRODUTO, QTDE, PRECOUNITARIO) VALUES(NULL, 1, 20, 2);

ALTER TABLE PRODUTO AUTO_INCREMENT = 1;
ALTER TABLE COMPRA AUTO_INCREMENT = 1;
ALTER TABLE VENDA AUTO_INCREMENT = 1;

SELECT * FROM COMPRA;
SELECT * FROM PRODUTO;
SELECT * FROM VENDA;


DROP TRIGGER TR_VENDA_UPDATE;
DROP TRIGGER TR_COMPRA_DELETE;
DROP TRIGGER TR_PRODUTO_UPDATE;

-- ----------------------------------------------------- --
            -- trigger update produto--
DELIMITER $$
CREATE TRIGGER TR_PRODUTO_UPDATE AFTER  UPDATE ON COMPRA FOR EACH ROW
UPDATE PRODUTO SET ESTOQUE = ( SELECT QTDE FROM COMPRA )

WHERE ESTOQUE =  ESTOQUE
-- testei com IDPRODUTO onde pensei que deveria modificar apenas o produto referente ao id
 $$
DELIMITER ; 
            -- trigger update produto--
-- ----------------------------------------------------- --

-- ----------------------------------------------------- --
           -- trigger update venda--
DELIMITER $$
CREATE TRIGGER TR_VENDA_UPDATE AFTER UPDATE ON VENDA FOR EACH ROW

UPDATE PRODUTO SET ESTOQUE = (ESTOQUE - (SELECT QTDE from VENDA) ) 
where IDPRODUTO = IDPRODUTO

 $$
DELIMITER ;
            -- trigger update venda--
-- ----------------------------------------------------- --

-- ----------------------------------------------------- --
           -- trigger delete estoque--
DELIMITER $$
CREATE TRIGGER TR_COMPRA_DELETE AFTER DELETE ON COMPRA FOR EACH ROW
IF cq = (select QTDE from COMPRA) >= pe = (select ESTOQUE FROM PRODUTO) THEN 
UPDATE PRODUTO SET  ESTOQUE = (cq - pe ) 
where ESTOQUE = ESTOQUE;
END IF
 $$
DELIMITER ;
            -- trigger delete estoque--
-- ------------------------------------------------------------- --
  • On the first Trigger the line WHERE ESTOQUE = ESTOQUE will always be true then it will update all rows of the table.

  • yes, that’s right, I just want to update related to the product, update products individually, you know?

  • From a read in the keywords OLD and NEW

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.