2013-11-27 131 views
0

我正在尝试创建一个触发器,但是我不断收回语法错误。MySQL触发器创建。我的触发器有什么问题?

这里的语句:

DELIMITER $$ 

CREATE TRIGGER `swtalentbank`.`after_candidate_insert` 
    AFTER INSERT ON `Candidates` FOR EACH ROW 
    BEGIN 
     INSERT INTO useradmin (username, talent) 
     VALUES (NEW.email, 1); 
    UPDATE `Candidates` SET UserID = useradmin.userid where useradmin.username = NEW.email; 
    END 

DELIMITER ; 

我有一个登记表上我的网站。当一个人注册时,用他们的个人资料信息填充候选人表。

在候选人表中,有各种字段,其中两个是'email''UserID'UserID is also the PK in 'useradmin',所以我把这两个连起来。

因此,当用户注册时,我需要在'useradmin'中插入一个记录,其中包含刚刚用于注册的电子邮件地址,然后更新'Candidates'表,其中包含'useradmin' 。

我希望这有道理吗?

注意:在运行语句之前,我正在更改分隔符。

回答

0

您应该在结束插入查询后使用分号。

创造你与你当前的代码至少两个基本问题触发时,您可以使用INSERT ... ON DUPLICATE KEY UPDATE语法的目的

+0

刚添加的。我更新了我的问题,以显示我正在运行的内容。 – Mcam435

0

尝试这个...

DELIMITER $$ 

CREATE TRIGGER `swtalentbank`.`after_candidate_insert` 
    AFTER INSERT ON `Candidates` FOR EACH ROW 
    BEGIN 
     INSERT INTO useradmin (username, talent) 
     VALUES (NEW.email, 1); 
    UPDATE `Candidates` SET UserID = useradmin.userid where useradmin.username = NEW.email; 
    END $$ 

DELIMITER ; 
+0

谢谢,虽然我现在得到这个:'#1064 - 你的SQL语法有错误;检查对应于您的MySQL服务器版本的手册,以在'第7行'处使用'$$ DELIMITER' – Mcam435

1

除了正确使用DELIMITER

  1. 在MySQL中,您不能使用针对表(candidates)的DML语句(在您的案例中为UPDATE)您定义了一个触发器(也是candidates)。您的只有选项是使用BEFORE触发器并将行的值设置为userid插入正确的值。
  2. 您不能像在您的UPDATE中那样任意引用某个表的列(useradmin.userid)。您没有加入useradmin表或在子查询中使用它。

话虽这么说,并假设useriduseradmin表是一个auto_increment列的触发可能是这样

DELIMITER $$ 
CREATE TRIGGER after_candidate_insert 
BEFORE INSERT ON candidates 
FOR EACH ROW 
BEGIN 
    INSERT INTO useradmin (`username`, `talent`) VALUES (NEW.email, 1); 
    SET NEW.userid = LAST_INSERT_ID(); 
END$$ 
DELIMITER ; 

下面是SQLFiddle演示