如何使用存储过程中的insert语句生成的值?

时间:2013-08-12 12:25:19

标签: mysql sql stored-procedures

我有一个过程,要求我将新记录插入到多个表中,我想我会尝试使用存储过程,因为我在PHP 5.3.5中开发并使用MySql Server 5.5.8。

创建了一个简单的Insert过程但我想获取最近添加的id的值,以便它可以用于后续插入。

表的id值设置为auto_increment,并且是bigint(20)。 insert语句有效,但是当我尝试使用DECLARE语句时,我得到以下错误:

  

#1064 - 您的SQL语法出错;查看与您的> MySQL服务器版本对应的手册,以便在'DECLARE @i BIGINT(20)附近使用正确的语法; END'在行> 8

存储过程如下:

CREATE PROCEDURE test(
   IN a VARCHAR(255),
   IN b VARCHAR(255),
   IN c BIGINT(20)
)
BEGIN
   INSERT INTO tableA (datetime_created) VALUE (NOW());
   DECLARE @i BIGINT(20);   // or BIGINT(20);
   SET @i = SELECT id FROM tableA ORDER BY DESC LIMIT 1;
   INSERT INTO tableB(attr1, attr2, attr3, attr4)  VALUES (a, b, c, @i);
END

我删除了所有语句,当我构建我认为是一个简单的存储过程时,只要添加第二行就会出现错误。任何帮助都会非常感激,因为我一直在寻找并试图解决这个问题,但我还没有找到解决方案。

2 个答案:

答案 0 :(得分:1)

有几个问题:

  1. 变量声明应首先出现
  2. 使用DECLARE您打算使用local (stored procedure level) variable而不是用户变量。为此,请勿在变量名称前使用@
  3. 第一次INSERT中有拼写错误。它应该是VALUES而不是VALUE
  4. 使用LAST_INSERT_ID()函数为刚刚插入的行而不是
  5. 检索auto_incremented列的值

    您的代码可能看起来像这样

    DELIMITER $$
    CREATE PROCEDURE test(
       IN a VARCHAR(255),
       IN b VARCHAR(255),
       IN c BIGINT(20)
    )
    BEGIN
       DECLARE i BIGINT(20);   // or BIGINT(20);
    
       INSERT INTO tableA (datetime_created) VALUES (NOW());
       SET i = LAST_INSERT_ID();
       INSERT INTO tableB(attr1, attr2, attr3, attr4)  VALUES (a, b, c, i);
    END$$
    DELIMITER ;
    

    在这种特殊情况下,您根本不需要变量。 SP的修订版本可能如下所示

    DELIMITER $$
    CREATE PROCEDURE test(
       IN a VARCHAR(255),
       IN b VARCHAR(255),
       IN c BIGINT(20)
    )
    BEGIN
       INSERT INTO tableA (datetime_created) VALUES (NOW());
       INSERT INTO tableB(attr1, attr2, attr3, attr4)  VALUES (a, b, c, LAST_INSERT_ID());
    END$$
    DELIMITER ;
    

    这两个版本的 SQLFiddle 演示

答案 1 :(得分:0)

您必须将分隔符设置为其他内容,然后;

由于您可能正在使用phpMyAdmin,因此在主textarea下有一个输入字段。标准为;,例如使用##