一尘不染

MySQL触发器:删除后从表中删除

mysql

范围:两个表。创建新的顾客时,他们会将有关他们的一些信息存储到第二张表中(这也使用触发器完成,它可以按预期工作)。这是我的表结构和关系的示例。

表1-> 顾客

+-----+---------+-----+
+  id +   name  + val +
+=====+=========+=====+
+  37 +  george +  x  +
+-----+---------+-----+
+  38 +  sally  +  y  +
+-----+---------+-----+

表2-> patron_info

+----+-----+----------+
+ id + pid +   name   +
+----+-----+----------+
+  1 +  37 +  george  +
+----+-----+----------+
+  2 +  38 +  sally   +
+----+-----+----------+

管理员可以管理顾客。当他们选择移走顾客时,将顾客从 桌子1 移开patrons。此时, 表2 没有任何反应patron_info

我只是想创建一个触发器,以便在表1的项目已删除时从表2中删除。这是我尝试过的…

最初,我尝试删除触发器(如果存在)(只是为了清除空气)…

DROP TRIGGER IF EXISTS log_patron_delete;

然后,我尝试稍后创建触发器…

CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
    WHERE patron_info.pid = patrons.id
END

在这一点上,我得到语法错误1046: Check syntax near END on line 6。我不知道这是什么错误。我尝试了几种不同的变体。另外,我是否需要在此处使用分隔符?

谁能帮助我恢复理智?


阅读 356

收藏
2020-05-17

共1个答案

一尘不染

我认为触发代码中有错误。当您要删除所有带有已删除顾客ID的行时,必须使用 old.id (否则它将删除其他ID)

尝试将其作为新触发器:

CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
    WHERE patron_info.pid = old.id;
END

不要忘记“;” 在删除查询上。同样,如果要在控制台窗口中输入TRIGGER代码,则也要使用定界符。

2020-05-17