我有一个过程,要求我将新记录插入到多个表中,我想我会尝试使用存储过程,因为我在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
我删除了所有语句,当我构建我认为是一个简单的存储过程时,只要添加第二行就会出现错误。任何帮助都会非常感激,因为我一直在寻找并试图解决这个问题,但我还没有找到解决方案。
答案 0 :(得分:1)
有几个问题:
DECLARE
您打算使用local (stored procedure level) variable而不是用户变量。为此,请勿在变量名称前使用@
。VALUES
而不是VALUE
LAST_INSERT_ID()
函数为刚刚插入的行而不是您的代码可能看起来像这样
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下有一个输入字段。标准为;
,例如使用##
。