1

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

创建了一个简单的插入过程,但我想获取最近添加的 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

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

4

2 回答 2

1

有几个问题:

  1. 变量声明应该放在第一位
  2. 使用DECLARE您的意思是使用本地(存储过程级别)变量而不是用户变量。为此,请勿@在变量名前使用。
  3. 第一个 INSERT 有错字。它应该VALUES代替VALUE
  4. 使用LAST_INSERT_ID()函数来检索刚刚插入的行的 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演示

于 2013-08-12T12:30:37.150 回答
0

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

由于您可能正在使用 phpMyAdmin,因此在主文本区域下有一个输入字段。标准是;,使用 eg##代替。

于 2013-08-12T12:31:14.413 回答