26

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

表 1->顾客

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

表 2 ->赞助人信息

+----+-----+----------+
+ 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。我不知道此时错误是什么。我尝试了几种不同的变体。另外,我需要在这里使用分隔符吗?

谁能帮助我恢复理智?

4

3 回答 3

51

我认为触发代码中有错误。由于您要删除所有带有已删除读者 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 代码,也请使用分隔符。

于 2012-08-05T17:18:30.820 回答
17

为什么不在外键patron_info.pid 上设置 ON CASCADE DELETE?

于 2016-07-19T05:40:59.130 回答
0
create trigger doct_trigger
after delete on doctor
for each row
delete from patient where patient.PrimaryDoctor_SSN=doctor.SSN ;
于 2015-11-19T14:38:35.187 回答