Mysql 递归更新触发器工作不正常
我已经创建了两个表Mysql 递归更新触发器工作不正常,mysql,sql,triggers,Mysql,Sql,Triggers,我已经创建了两个表abc和xyz。两个表的数据如下所示 表abc: +------+-------+--------+ | roll | name | status | +------+-------+--------+ | 1 | john | I | | 1 | ken | I | | 1 | abel | I | | 2 | aston | I | | 2 | ron | I | +------+
abc
和xyz
。两个表的数据如下所示
表abc:
+------+-------+--------+
| roll | name | status |
+------+-------+--------+
| 1 | john | I |
| 1 | ken | I |
| 1 | abel | I |
| 2 | aston | I |
| 2 | ron | I |
+------+-------+--------+
+-------+-------+---------+
| roll1 | name1 | status1 |
+-------+-------+---------+
| 1 | john | I |
| 1 | ken | I |
| 1 | abel | I |
| 2 | aston | I |
| 2 | ron | I |
+-------+-------+---------+
表xyz:
+------+-------+--------+
| roll | name | status |
+------+-------+--------+
| 1 | john | I |
| 1 | ken | I |
| 1 | abel | I |
| 2 | aston | I |
| 2 | ron | I |
+------+-------+--------+
+-------+-------+---------+
| roll1 | name1 | status1 |
+-------+-------+---------+
| 1 | john | I |
| 1 | ken | I |
| 1 | abel | I |
| 2 | aston | I |
| 2 | ron | I |
+-------+-------+---------+
两个表中的状态都可以更新为'D'
或'E'
。假设在表abc
中,如果John
的状态变为'D'
,那么我需要取John的roll(即1
),并将xyz
中的所有状态更新为'D'
,其中roll1=1
类似地,假设xyz
表中ron
的状态更改为'E'
,则aston
和ron
的状态应为'E'
这需要使用更新触发器来实现。我为这两个表创建了2个更新触发器。使用的触发器是
DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `test2`.`abc_trigg`$$
create trigger `test2`.`abc_trigg` BEFORE UPDATE on `test2`.`abc`
for each row BEGIN
IF @__disable_trigger is null THEN
SET @__disable_trigger = 1;
if new.status = 'D' then
update xyz set status1='D' where roll1 = new.roll;
elseif new.status = 'E' then
update xyz set status1='E' where roll1 = new.roll;
end if;
end if;
end;
$$
DELIMITER ;
但是这些触发器不正确,我没有得到预期的输出。请指导我解决问题并帮助我获得相关输出?您没有说明什么不正确,什么错误,但您似乎有很多逻辑代码-为什么不更新xyz set status1=new.status,其中roll 1=new.roll
?更新后执行。您好,谢谢您的回复。我无法使用更新xyz set status1=new.status,其中roll1=new.roll。我使用if条件的原因是,每当我更新status='D',然后将第二个表中对应ID的状态更新为'D';“E”也一样。对于任何其他字母表,无需执行任何操作。根据触发器,这不会发生。另外,当我更新第二个表时,它的更新触发器触发并导致无限循环条件,为了避免这种情况,我最初使用了变量。但是这也没什么帮助。你能建议我现在更了解这个问题吗。也许可以尝试在更新后将这两个触发器更改为,并添加和status!='D'
到每个更新(在需要时将D
更改为E
)。同时删除禁用\u触发器
,因为它没有帮助。此外,请参阅此帖子:此外,此链接可能会有所帮助。请注意,带有全局变量标志(disable_trigger)的技术需要在嵌入式更新的任一侧打开和关闭。