作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个过程需要我将新记录插入多个表,我想我会尝试使用存储过程,因为我在 PHP 5.3.5 中开发并使用 MySql Server 5.5.8。
创建了一个简单的 Insert 过程,但我想获取最近添加的 id 的值,以便它可以用于后续的插入。
表的id值设置为auto_increment,并且是bigint(20)。 insert 语句有效,但是当我尝试使用 DECLARE 语句时,出现以下错误:
#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 'DECLARE @i BIGINT(20); END' at line >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
我删除了所有语句,当我构建我认为是简单存储过程的内容时,添加第二行后立即出现错误。任何帮助将不胜感激,因为我一直在搜索并试图解决这个问题,但到目前为止我还没有找到解决方案。
最佳答案
有几个问题:
DECLARE
你打算使用 local (stored procedure level) variable而不是用户变量。为此,不要在变量名前使用 @
。VALUES
而不是 VALUE
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 两个版本的演示
关于mysql - 如何在存储过程中使用插入语句生成的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18186935/
我是一名优秀的程序员,十分优秀!