MySQL触发器-移动内部顺序列

短跑

我有下表[页面]:

pgid|pgname|pgorder
----+------+-------
  1 |Page#1|   1
  2 |Page#2|   2
  3 |Page#3|   3
  4 |Page#4|   4

列“ pgorder”代表特定页面的位置。

我需要触发器,该触发器将在删除一页记录后自动将其余页面的位置转移(减少)一个位置。

因此,当我删除例如pgid = 2时,该表应如下所示:

pgid|pgname|pgorder
----+------+-------
  1 |Page#1|   1
  3 |Page#3|   2
  4 |Page#4|   3

此MySQL触发器应如何显示?

比尔·卡温

您不能使用DML语句来修改为其触发触发器的表。您收到此错误:

ERROR 1442 (HY000): Can't update table 'pages' in stored function/trigger because 
it is already used by statement which invoked this stored function/trigger.

原因是它冒着无限循环或至少死锁的风险。如果DELETE在触发触发器之前锁定了表,然后在触发器内部执行了UPDATE,要求对表进行锁定,则两者均无法进行。

参见https://dev.mysql.com/doc/refman/5.6/en/stored-program-restrictions.html

存储的函数或触发器无法修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。

正确的解决方案是分两步执行此任务:首先是DELETE,然后是UPDATE:

DELETE FROM pages WHERE pgorder = 3;
UPDATE pages SET pgorder = pgorder-1 WHERE pgorder > 3;

您可以在事务内执行这两个DML语句,以确保它们在提交之前都成功,否则回滚该事务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL触发器-移动内部顺序列

来自分类Dev

创建Oracle序列触发器

来自分类Dev

游标在触发器内部并更新表列

来自分类Dev

MySql触发器内部的以下if语句有什么问题

来自分类Dev

插入内部触发器不触发

来自分类Dev

Oracle使用表触发器在触发器内部合并

来自分类Dev

C ++移动分配触发器首先移动构造函数

来自分类Dev

使用触发器插入具有顺序标识的行

来自分类Dev

创建触发器和序列以创建新的主键

来自分类Dev

在过程触发器内部动态插入记录

来自分类Dev

函数在触发器内部返回错误值

来自分类Dev

如何使用内部联接创建触发器

来自分类Dev

MYSQL GUID触发器

来自分类Dev

MySQL触发器更新

来自分类Dev

MySQL的触发器问题

来自分类Dev

MYSQL多个触发器

来自分类Dev

带 T 型触发器的 VHDL 3 位序列计数器

来自分类Dev

如何通过检查JSON对象内部的条件来使触发器插入控制器

来自分类Dev

MySQL触发器不保存

来自分类Dev

使用Sequel Pro的MySQL触发器

来自分类Dev

使用MySQL触发器的Web通知

来自分类Dev

MySQL创建触发器语法

来自分类Dev

MySQL触发器插入副本的行

来自分类Dev

MySQL触发器插入问题

来自分类Dev

插入MySQL触发器(错误)

来自分类Dev

触发器MySQL的结果集

来自分类Dev

在插入时创建MySQL触发器

来自分类Dev

MySQL触发器不起作用

来自分类Dev

MySQL触发器自动递增