mysql插入触发器错误

时间:2016-03-19 01:43:25

标签: mysql sql triggers mysql-error-1064

我刚搬到phymysql,我在创建触发器方面遇到了问题。以下是我的剧本

CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
FOR EACH ROW
BEGIN

    DECLARE var1 INT;
    DECLARE var2 INT;
    DECLARE var3 CHAR(100);
    DECLARE var4 CHAR(100);
    DECLARE var5 CHAR(3);

    SELECT      profile_id,
                profile_id,
                fname,
                fname,
                fpage
        FROM    profile
        INTO    var1,
                var2,
                var3,
                var4,
                var5;

    IF  var5 = 'yes'
    THEN

        INSERT INTO fiends
                (req_id, resp_id, req_name, resp_name, fpage)
            VALUES
                (var1, var2, var3, var4, 'yes');

    END IF;

END

当我执行时,我收到此错误

#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 '' at line 5 

任何帮助都将是我的赞赏。

2 个答案:

答案 0 :(得分:0)

在MySQL中执行此操作的典型方法是使用:=

SELECT var1 := profile_id,
       var2 := profile_id,
       var3 := fname,
       var4 := fname,
       var5 := fpage
FROM profile;

在我看来,into条款与Oracle类似。

那说,有两点需要注意:

  1. 这似乎假设profile只有一行。通常会有where条款。
  2. 您应该使用前缀(例如v_)命名变量,以免与列混淆。
  3. 但是,我会在没有变量的情况下写这个:

    DELIMITER $$
    CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
    FOR EACH ROW
    BEGIN
        INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage)
            SELECT profile_id, profile_id, fname, fname
            FROM profile p
            WHERE fpage = 'yes';
    END$$
    DELIMITER ;
    

    这似乎更简单。我猜测yes应该是一个字符串。

    编辑:

    如果您想要插入的行,请使用new

    DELIMITER $$
    CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile
    FOR EACH ROW
    BEGIN
        INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage)
            SELECT new.profile_id, new.profile_id, new.fname, new.fname
            FROM dual
            WHERE new.fpage = 'yes';
    END$$
    DELIMITER ;
    

答案 1 :(得分:0)

我怀疑问题在于语句分隔符;我怀疑它仍然设置为分号字符。

因为触发器包含分号字符,要使“create trigger”语句作为一个单元运行,您需要将分隔符更改为在“create trigger”语句中不出现的字符串

例如:

-- change the statement delimiter to something other than semicolon
DELIMITER $$

-- execute the "create trigger" statement containing semicolons
CREATE TRIGGER ...
BEGIN
    ... ;
    ... ; 
    IF ( ... ) THEN 
        ... ;
    END IF;
    ... ;
END$$
-- the occurrence of the $$ delimiter on the line above ends the statement

-- change the delimiter back to semicolon
DELIMITER ;

另外,我认为不允许触发器从刚刚插入的同一个表中进行选择。 (我知道在Oracle中限制FOR EACH ROW触发器;我必须查阅MySQL参考手册以确定...有一节关于“对mysql存储程序的限制”,程序是最自由的,函数有与程序相同的限制,加上更多和触发器具有与功能相同的限制,以及更多。

此外,当执行该触发器时(如果允许从同一个表中进行选择),该SELECT语句可能会返回多行。使用INTO形式,我们预计最多会返回一行。

如果目的是引用刚刚插入的行的值,并将其插入到另一个表fiends(或friends?)中的插入中 使用 NEW.column_name 表单来引用值

例如:

DELIMITER $$

CREATE TRIGGER profile_ai 
AFTER INSERT ON profile
FOR EACH ROW
BEGIN
    IF ( NEW.fpage = 'yes' ) THEN
        -- are some of your friends fiends ?
        INSERT INTO fiends 
        ( req_id
        , resp_id
        , req_name
        , resp_name
        , fpage
        ) VALUES
        ( NEW.profile_id
        , NEW.profile_id
        , NEW.fname
        , NEW.fname
        , 'yes'
        );
    END IF;
END$$

DELIMITER ;