我试图创建一个 After Insert
触发器,但是当我运行它时,它没有给出错误,但 mySQL 服务器似乎忽略它。
当我在创建触发器后检查表时,触发器部分保持为空。这是代码:
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 ;
有什么想法吗?
我想要实现的是:在表“Produto”中插入一行后,我想根据另一个表中的另一个值更新其中一个值。
编辑:
我尝试多次运行代码,似乎它甚至没有创建触发器,否则会给我一个错误“触发器已存在”
最佳答案
正如我在最初的评论中所说,您无法更新触发器所在表的内容(除了触发器正在操作的行之外);通常,从中进行选择也不是一个好主意。此外,正如其他人所暗示的那样,您实际上并未终止触发器定义(使用替代 $$ 分隔符)。此外,您似乎对 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 ;
编辑:删除了我不小心从初始复制粘贴中保留的最终更新
;并将所有 SQL 关键字大写以提高可读性。
注意:iva 和 valor_iva 的声明中应包含数据类型。
关于mysql 触发器无法识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37350456/