SQL 触发器 - 有一个会搞乱新的 SQL 查询
Posted
技术标签:
【中文标题】SQL 触发器 - 有一个会搞乱新的 SQL 查询【英文标题】:SQL Trigger - Having one is messing up new SQL queries 【发布时间】:2021-10-04 01:34:50 【问题描述】:我可以手动执行以下代码:
UPDATE pfields_cont p, members m
SET m.member_group_id = 6
WHERE p.member_id = m.member_id
AND m.member_group_id != 6
AND p.field_2 = 'Teacher';
但是,如果我尝试使用与上述相同的代码创建触发器,则会在我的数据库中创建新用户时收到此错误:
无法更新存储函数/触发器中的表“成员”,因为它是 已被调用此存储函数/触发器的语句使用 (1442)
谁能帮忙修复触发器?
谢谢!
编辑 1:
完整的触发器定义:
CREATE TRIGGER `newTeacher` AFTER INSERT ON `members` FOR EACH ROW UPDATE
pfields_cont p,
members m
SET
m.member_group_id = 6
WHERE
p.member_id = m.member_id
AND m.member_group_id != 6
AND p.field_2 = 'Teacher'
【问题讨论】:
你如何“...在我的数据库中创建一个新用户...”?您的创建查询似乎干扰了触发器。 触发器监听的事件是什么? @TheImpaler 它是一个 INSERT 命令。类似于:“插入members
(group_id
,group_others
,joined
,ip
,timezone
...)值(1,'' ...)”。
该错误意味着您无法在触发器处理中的任何位置引用 same 表。 (用于阅读或写作)
让我们continue this discussion in chat.
【参考方案1】:
由于您不能在触发器的定义中引用同一个表(用于读取或写入),因此可以通过将 member_group_id
设置为 6(如果 field_2
为 Teacher
)来简化触发器处理:
CREATE TRIGGER `newTeacher` BEFORE INSERT ON `members`
FOR EACH ROW UPDATE
BEGIN
Declare fieldInfo varchar(30);
SELECT field_2 INTO fieldInfo
FROM pfields_cont
WHERE pfields_cont.member_id = NEW.member_ID;
IF fieldInfo = 'Teacher' THEN
SET NEW.member_group_id = 6;
END IF;
END;
【讨论】:
以上是关于SQL 触发器 - 有一个会搞乱新的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章