MySql和SQL在更新触发器之前设置了不同表/cloumn的更新无法更新存储函数/触发器中的表

jmp7cifd  于 2023-05-16  发布在  Mysql
关注(0)|答案(1)|浏览(105)

我有一个连接表,它与2个表(A和C)的n:m关系相连接。连接表(B)也保存一些信息。
A ----- B ----- C
在表A中,我有一个when_modified列,如果有任何变化,我总是希望保持当前状态。这应包括对表B的修改。
因此,我在表B上有一个更新前触发器,查询如下

UPDATE A SET when_modified = NOW() WHERE id = NEW.id;

问题是,如果我现在执行一个更新查询(在B上有一个join),我会得到以下错误
无法更新存储函数/触发器中的表“A”,因为它已被调用此存储函数/触发器的语句使用。

Update B vv JOIN A v on vv.id = v.id SET vv.block = 1 WHERE v.status = 'finished'
ctehm74n

ctehm74n1#

您需要重写UPDATE语句。
你不能扣扳机,否则会发生的。无尽的循环
但是一个简单的改变也会起到同样的效果

CREATE TABLE A (id int, status  varchar(10), when_modified  datetime)
INSERT INTO A VALUES (1,'finished',now())
CREATE TABLE B (id int, block int)
INSERT INTO B VALUES(1,0)
Update B vv JOIN A  v on vv.id = v.id SET vv.block = 1, v.when_modified = NOW()  WHERE v.status = 'finished'
Rows matched: 2  Changed: 1  Warnings: 0
SELECT * FROM A
身份证地位修改时
1完成2023-05-15 20:31:15
SELECT * FROM B
身份证
11

fiddle

相关问题