Triggers in Mysql with "Unknown column" errors in the key of a table where these triggers are stored

Asked

Viewed 128 times

1

I don’t understand why you made such a mistake Unknown column in three triggers of the same table, as it always points to the keys and they in my view are correct.

The error comes from the cd_sale key of the sale table

The image of the tables itens_venda and venda described in triggers that are stored in itens_venda sane:

inserir a descrição da imagem aqui

Are three triggers:

  • The error of Trigger itens_venda_AFTER_INSERT is Error Code: 1054. Unknown column 'cd_venda' in 'NEW'
DELIMITER $
CREATE TRIGGER itens_venda_AFTER_INSERT 
AFTER INSERT ON itens_venda 
FOR EACH ROW
BEGIN
    /* atualiza o valor total da venda ao adicionar o produto da compra */
    UPDATE venda SET valor_total = valor_total + (NEW.valor_item * NEW.quantidade_item) 
    WHERE cd_venda = NEW.cd_venda; -- Daqui vem o erro
END $
DELIMITER ;
  • The error of Trigger itens_venda_BEFORE_UPDATE is Error Code: 1054. Unknown column 'cd_venda' in 'OLD'
DELIMITER $
CREATE TRIGGER itens_venda_BEFORE_UPDATE 
BEFORE UPDATE 
ON itens_venda 
FOR EACH ROW
BEGIN
    /* Se for realizado a diminuição da quantidade de item da venda será registrado na tabela de devolução.*/
    IF OLD.status = 'Adicionado' THEN
        IF NEW.quantidade_item < OLD.quantidade_item THEN
            /* Atualiza o valor da venda quando diminui a quantidade do item */
            UPDATE venda SET valor_total = valor_total - (OLD.valor_item * (OLD.quantidade_item - 
            NEW.quantidade_item)) 
            WHERE cd_venda = OLD.cd_venda; -- Daqui vem o erro
        END IF;
    END IF;
END$
DELIMITER ;
  • The error of Trigger itens_venda_AFTER_UPDATE is Error Code: 1054. Unknown column 'cd_venda' in 'OLD'
DELIMITER $
CREATE TRIGGER itens_venda_AFTER_UPDATE
AFTER UPDATE 
ON itens_venda
FOR EACH ROW
BEGIN
    /* Atualiza o valor total se o produto for cancelado */
    IF NEW.status = 'Cancelado' THEN
        UPDATE venda SET valor_total = valor_total - (OLD.valor_item * OLD.quantidade_item) 
        WHERE cd_venda = OLD.cd_venda; -- Daqui vem o erro
    END IF;
END$
DELIMITER ;
  • But the countryside cd_venda does not exist in itens_venda the nearest name is the field cd_itens_venda.

  • @Augustovasques I’ll look here if that’s right.

  • Where is WHERE cd_venda = OLD.cd_venda change to WHERE cd_venda = OLD.cd_itens_venda

  • 1

    @Augustovasques worked, thank you.

  • @Augustovasques answers there question for me marks your answer as the best.

  • WHERE cd_venda = OLD.cd_itens_venda certo, the rest that owns NEW will be the same thing?

  • Yes the same thing.

  • Type WHERE cd_venda = NEW.cd_itens_venda in the first two triggers?

  • If the field cd_itens_venda changed use NEW.cd_itens_venda if no change OLD.cd_itens_venda

Show 4 more comments

1 answer

0


The field cd_venda does not exist in the table itens_venda therefore the errors within the triggers.

Remake the relationships between primary key vendas.cd_venda with the foreign key itens_venda.cd_itens_venda.

DELIMITER $
CREATE TRIGGER itens_venda_AFTER_INSERT 
AFTER INSERT ON itens_venda 
FOR EACH ROW
BEGIN
    /* atualiza o valor total da venda ao adicionar o produto da compra */
    UPDATE venda SET valor_total = valor_total + (NEW.valor_item * NEW.quantidade_item) 
    WHERE cd_venda = NEW.cd_itens_venda; 
END $
DELIMITER ;

DELIMITER $
CREATE TRIGGER itens_venda_BEFORE_UPDATE 
BEFORE UPDATE 
ON itens_venda 
FOR EACH ROW
BEGIN
    /* Se for realizado a diminuição da quantidade de item da venda será registrado na tabela de devolução.*/
    IF OLD.status = 'Adicionado' THEN
        IF NEW.quantidade_item < OLD.quantidade_item THEN
            /* Atualiza o valor da venda quando diminui a quantidade do item */
            UPDATE venda SET valor_total = valor_total - (OLD.valor_item * (OLD.quantidade_item - 
            NEW.quantidade_item)) 
            WHERE cd_venda = OLD.cd_itens_venda;
        END IF;
    END IF;
END$
DELIMITER ;

DELIMITER $

CREATE TRIGGER itens_venda_AFTER_UPDATE
AFTER UPDATE 
ON itens_venda
FOR EACH ROW
BEGIN
    /* Atualiza o valor total se o produto for cancelado */
    IF NEW.status = 'Cancelado' THEN
        UPDATE venda SET valor_total = valor_total - (OLD.valor_item * OLD.quantidade_item) 
        WHERE cd_venda = OLD.cd_itens_venda;
    END IF;
END$
DELIMITER ;

Browser other questions tagged

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