mysql after 不起作用_我的MySQL触发器不起作用,语法简单,不复杂

我的MySQL触发器不起作用,语法简单,不复杂

我不知道为什么我的触发器不工作,查询工作时手动使用它,但是当我想通过触发器更新它不起作用。 有人可以帮我知道为什么吗?

这是我的触发器:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table` FOR EACH ROW BEGIN IF (NEW.played_games <> OLD.played_games) THEN update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1)); END IF; END

简单来说,这是一个体育赛事,当统计人员捕捉到比赛的分数时,他会自动添加一个playing_game,并且分别取得了胜利,平局或者丢失的比赛,所以当他改变了play_games时,我的触发器应该会自动执行,并且必须改变PTS专栏。 但它不工作。

另外,当我手动编辑plays_games列,我得到这个错误:“不能更新存储的函数/触发器中的表pos_table,因为它已经被调用这个存储的函数/触发器的语句使用”。

存储的函数或触发器不能修改调用该函数或触发器的语句(用于读取或写入)的表。

来自: 存储的程序限制 。

一般情况下,在插入时触发一个触发器,如果​​要更改正在插入的值,可以使用BEFORE INSERTtypes的触发器,并更改NEW

也注意到下面的声明不是你想要的。

update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));

它更新整个表,而我认为你只是试图更新一个特定的行。 无论如何,这是一个简单的计算,所以你并不需要存储这个列。 您可以轻松地计算显示时间的值,并使您的代码变得更简单+避免触发器的问题。

这段代码触发自己。 无尽的循环或堆栈溢出….

正如@ e4c5所提到的,即使你的触发器可以更新同一个表(不行),你的UPDATE也会影响表的所有行,而不仅仅是当前正在更新的单行。

如果你想要一个触发器改变正在更新的行的值,你可以使用SET :

CREATE TRIGGER `upd_PTS` BEFORE UPDATE ON `pos_table` FOR EACH ROW BEGIN IF (NEW.played_games <> OLD.played_games) THEN SET NEW.PTS = NEW.won_games*2 + NEW.tie_games*1; END IF; END

另请注意,您不能更改导致触发器运行的行中的值,除非您在BEFORE触发器中执行此操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL触发器是一种在特定事件发生时自动执行的数据库对象。下面是MySQL触发器的基本语法: CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- 触发器执行的SQL语句 END; 其中,trigger_name 是触发器的名称,可以根据实际需求自定义。BEFORE 或 AFTER 关键字指定触发器是在事件之前还是之后执行。INSERT、UPDATE 和 DELETE 是触发器要监听的事件类型。table_name 是触发器所属的表名。 FOR EACH ROW 关键字表示每次执行触发器时都会针对触发事件中的每一行执行相应的操作。 在 BEGIN 和 END 之间,可以编写触发器要执行的SQL语句,可以包含条件判断、更新数据等操作。 例如,下面是一个创建在表 `orders` 上的 `AFTER INSERT` 触发器的示例: CREATE TRIGGER after_order_insert AFTER INSERT ON orders FOR EACH ROW BEGIN -- 触发器执行的SQL语句 INSERT INTO order_logs(order_id, log_message) VALUES(NEW.order_id, 'New order created'); END; 该触发器会在 `orders` 表上进行插入操作后执行,每次插入一条新的订单记录时,会将相应的订单日志插入到 `order_logs` 表中。 请注意上述示例中使用了 `NEW.order_id` 来引用插入的新行的 `order_id` 值。`NEW` 是一个特殊的关键字,代表了触发器所关联的事件中的新增行。 以上是MySQL触发器的基本语法,根据实际需求,你可以根据不同的事件和操作编写相应的触发器逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值