MySQL触发器澄清后插入

时间:2016-03-30 20:49:13

标签: mysql sql

我这里有这个代码:

CREATE TRIGGER testTrigger 
AFTER INSERT ON users
BEGIN 
    DECLARE @uid VARCHAR(60)
    SET @uid = (SELECT userid FROM inserted)
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,@uid,5.0,5.0)
END;

我们的想法是,一旦遇到第一个“用户”表,就将生成的用户ID与其他数据一起插入到其他表中,但phpMyAdmin会给出此错误代码:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 
BEGIN 
DECLARE @uid VARCHAR(60)
SET @uid = (SELECT userid FROM inserted)
at line 3

有人可以澄清为什么这个触发器不好吗?

1 个答案:

答案 0 :(得分:1)

我发现了四个问题:

  • 您必须使用DELIMITER s,以便能够像往常一样用分号完成命令。
  • FOR EACH ROW遗失了。
  • 使用new.uid访问最近插入的uid。
  • 我还建议使用过程变量而不是特定于会话的用户定义的@variables,后者是松散类型的,并且没有声明你已经完成。

但你甚至不必声明一个变量。 如果您不使用phpMyAdmin

DELIMITER //
CREATE TRIGGER testTrigger 
AFTER INSERT ON users FOR EACH ROW
BEGIN 
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,new.uid,5.0,5.0);
END//
DELIMITER ;

检查this answer关于分隔符,the MySQL 5.7 docs on triggersthis answer关于变量。

编辑,我过度使用了phpMyAdmin:

我不使用phpMyAdmin。但你可以(从here偷走)

  • 在phpMyAdmin中,选择要使用的数据库。
  • 转到页面顶部的SQL选项卡。
  • 在"运行SQL查询/查询数据库"表单,将分隔符更改为$$。 (位于表格底部的小方框中)
  • 在表单的主对话框中输入SQL触发器。正确的语法如下:
CREATE TRIGGER testTrigger 
AFTER INSERT ON users FOR EACH ROW
BEGIN 
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,new.uid,5.0,5.0);
END;$$
  • 点击" GO"超级特权。