我有下表[页面]:
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] 删除。
我来说两句