2012-08-05 154 views
14

范围:两个表。当一个新的顾客被创建时,他们有一些关于他们的信息被存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表格结构和关系的一个例子。MySQL触发器:从表中删除后删除

表1->惠顾

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

表2 - >patron_info

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

管理员可以管理惠顾。当他们选择移除顾客时,该顾客从表1patrons移除。在这一点上,表2patron_info没有任何反应。

我只是试图创建一个触发器来删除表2,当表1删除了一个项目。以下是我已经试过......

起初,我尝试,如果它的存在(只是清除空气)下降触发...

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

任何人都可以帮助恢复我的理智?

+0

你需要什么帮助?你真正的问题是什么? – 2012-08-05 17:06:06

+0

@vivek_jonam删除触发器不会触发。它在第6行给我一个'END'的sytnax错误。另外,我是否将它包装在'DELIMETER $$'中? – Ohgodwhy 2012-08-05 17:07:23

+1

@Ohgodwhy:只是关于memcache问题的一个说明 - 它只在我添加它后才被链接。在我做到这一点之前,“相关”是没有的。 – zerkms 2014-05-13 02:16:29

回答

33

我认为触发代码有错误。 当你想删除的赞助人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代码,也可以使用分隔符。

+2

Maaaaaaaaaaaaaaaaaan。这一切都最终成为我WHERE子句中的分号。我真是个傻瓜。感谢那个vivek,非常感谢! – Ohgodwhy 2012-08-05 17:28:47

+1

为什么只为一个语句使用复合语句块?在[CREATE TRIGGER'语法](http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html)中没有要求这样做。 – Air 2014-05-08 17:40:16

+0

不要忘记“;” - 应该在BOLD – Ulterior 2014-08-08 09:52:19

-1
create trigger doct_trigger 
after delete on doctor 
for each row 
delete from patient where patient.PrimaryDoctor_SSN=doctor.SSN ; 
5

为什么不在外键上设置级联删除patron_info .pid?

+0

我认为,当我读这... – 2016-12-03 03:00:42