我试图创建一个After Insert
触发器但是当我运行它时,它没有给出任何错误,但我的SQL服务器似乎忽略了它。
当我在创建触发器后检查表时,触发器部分保持为空。这是代码:
delimiter $$
CREATE TRIGGER t_calcula_preco AFTER INSERT ON produto
begin
declare id = last_insert_id();
declare tipo_id;
declare iva;
declare valor_iva;
declare preco_sem_iva;
-- guardamos o ID do tipo de jogo
select new.prod_tdj_id into tipo_id from produto where new.prod_id = id;
-- guardamos o ID do iva
select tdj_iva_id into iva from tipo_de_jogo where tdj_id = tipo_id;
-- guardamos o valor do IVA
select valor into valor_iva from iva where iva_id = iva;
-- guardamos o valor do preco sem iva
select new.prod_preco into preco_sem_iva from produto where new.prod_id = id;
-- agora calculamos o preco com iva
update produto set prod_preco = (preco_sem_iva + (preco_sem_iva * valor_iva / 100));
end ;
delimiter ;
任何想法?
我想要实现的是:在我将一行插入表格后#34; Produto"我想根据另一个表中的另一个值更新其中一个值。
编辑:
我尝试多次运行代码,它似乎甚至创建触发器,否则它会给我一个错误" Trigger已经存在"
答案 0 :(得分:0)
正如我在最初的评论中所说,你不能更新你的触发器所在的表的内容(除了触发器正在操作的行);从中选择它通常不是一个好主意。此外,正如其他人暗示的那样,您实际上并未终止触发器定义(使用替换$$分隔符)。另外,您在使用NEW
时似乎有些困惑。
DELIMITER $$
CREATE TRIGGER t_calcula_preco AFTER INSERT ON produto
BEGIN
DECLARE iva;
DECLARE valor_iva;
-- guardamos o ID do iva
SELECT tdj_iva_id INTO iva
FROM tipo_de_jogo
WHERE tdj_id = NEW.prod_tdj_id
;
-- guardamos o valor do IVA
SELECT valor INTO valor_iva
FROM iva
WHERE iva_id = iva
;
-- agora calculamos o preco com iva
SET NEW.prod_preco := (NEW.prod_preco + (NEW.prod_preco * valor_iva / 100))
;
END$$
DELIMITER ;
编辑:删除了我从初始复制粘贴中不小心留下的最终UPDATE
;以及所有SQL关键字的上层可读性。
注意:iva和valor_iva的声明中应包含数据类型。