首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL局部变量作用域和触发器

问MySQL局部变量作用域和触发器
EN

Database Administration用户
提问于 2015-02-13 18:35:01
回答 1查看 1.4K关注 0票数 2

我有几个触发器,可以自动更新发票数据并在数据库中设置一些状态。

但是,如果有2个触发器的变量名相同,则当一个触发器执行更新而另一个触发器运行时,它们会被覆盖。

例如,

在支付表中插入前触发器设置变量@amountPaid

代码语言:javascript
复制
SET @amountPaid = @totalPayments + NEW.amount

有时,在付款前插入将触发对主记录的更新,该记录触发main触发器,该触发器为自己的条件在@amountPaid中选择总支付。但是,从这个角度来看,@amountPaid是0,因为important还没有完成,但这并不重要。非常奇怪的是,支付触发器中的@amountPaid变量现在是0。

所以现在我很好奇在MySQL中范围是如何工作的?

EN

回答 1

Database Administration用户

发布于 2015-02-13 18:58:22

这取决于变量的范围。

我曾经写过一个post 仅禁用一个表的触发器,它使用一个名为@TRIGGER_DISABLED的变量。

为了使变量禁用触发器,会话必须在表的任何SET @TRIGGER_DISABLED=0;或SET @TRIGGER_DISABLED=1;之前实例化值DML。如果断开和重新连接,则必须在每次重新连接时实例化该变量。

在您的示例中,当DB会话开始时,@amountPaid和@totalPayments必须在执行任何操作之前设置为0。如果您一直在运行总计,则无法断开和重新连接。

如果您总是断开和重新连接,则可以将正在运行的总计存储在一个全局表中,该表使用内存存储引擎和您选择的会话ID。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/91920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档