gpt4 book ai didi

mysql - 如何在存储过程中使用插入语句生成的值?

转载 作者:行者123 更新时间:2023-11-29 00:27:40 26 4
gpt4 key购买 nike

我有一个过程需要我将新记录插入多个表,我想我会尝试使用存储过程,因为我在 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

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

最佳答案

有几个问题:

  1. 变量声明应该放在第一位
  2. 使用 DECLARE 你打算使用 local (stored procedure level) variable而不是用户变量。为此,不要在变量名前使用 @
  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 两个版本的演示

关于mysql - 如何在存储过程中使用插入语句生成的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18186935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com