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

时间:2012-08-05 16:42:26

标签: mysql triggers mysql-error-1046

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

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

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

3 个答案:

答案 0 :(得分:41)

我认为触发器代码中存在错误。 由于您要删除所有已删除的顾客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代码,也可以使用分隔符。

答案 1 :(得分:11)

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

答案 2 :(得分:0)

- (void)didSelectPost {

    //Get session configuration
    NSString * const configName = @"com.xx.xxx";
    self.sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configName];
    self.sessionConfiguration.sharedContainerIdentifier = @"group.xx.ShareURL";

    //Init NSURLSession
    self.session  = [NSURLSession sessionWithConfiguration:self.sessionConfiguration];
    NSURLRequest *request = [self postContentToService:self.shareUrl.absoluteString];

    //post request
    self.sessionTask = [self.session dataTaskWithRequest:request];

    //resume
    [self.sessionTask resume];

    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}