【发布时间】:2020-01-10 22:59:30
【问题描述】:
更新 2:如果我用要执行的实际 SQL 代码手动替换下面的 EXECUTE 代码示例,它工作得非常好,这告诉我这个问题已经厌倦了 PREPARE、EXECUTE 和 DEALLOCATE PREPARE。
更新 1:实际上,似乎每个存储过程都已停止工作(例如,插入时总是返回 0)。非常奇怪的是,当我手动执行插入时,索引恢复得很好。但是当它通过存储过程执行时,它总是 0。唯一改变的是我重新启动了我的系统。而已。注意这是我的本地 127.0.0.1 MySQL 安装。为什么手动执行 INSERT 会返回 LAST_INSERT_ID() 但完全相同的插入的存储过程会失败?我没有在 SP 中使用提交/回滚,也没有更改提交的默认系统设置
这真是令人头疼。我有一个大而复杂的存储过程,它从动态 JSON 字段数据构建 SQL INSERT。在我将多个更新合并到一个 SP 以支持事务回滚之前,它一直运行良好(但我还没有放入任何代码)。
执行SQL select语句的代码是:
SET @mysql := var_sql_insert;
PREPARE SQLStatement1 FROM @mysql;
EXECUTE SQLStatement1;
DEALLOCATE PREPARE SQLStatement1;
SET var_company_main_id = LAST_INSERT_ID();
下面是正在执行的 SQL 代码:
INSERT INTO company_main (company_owner_account_ref_id,company_name,company_industry_ref_id,company_size_c,company_type_c,company_date_founded) VALUES (1,'TestCompany',2,1,1,'2009/05/06')
问题是 LAST_INSERT_ID() 每次在存储过程中执行 SQL 语句时都返回 0,但如果我手动执行它,LAST_INSERT_ID() 会很好地返回索引。请注意,我正在执行 INSERT 以具有正确定义的 PK 自动增量索引的表,所以这不是问题(这似乎是 0 结果的#1 原因)。
更疯狂的是,这个完全相同的代码之前运行得非常好——它没有改变——我唯一做的就是把它放在一个更大的存储过程中,并在 BEGIN 中添加一个标签(因为我在错误时执行 LEAVE )。
当我遍历代码时,它完美地执行;它只是 LAST_INSERT_ID() 现在总是返回 0,即使记录插入得很好(以及增加的 ID/索引)。
有什么想法吗?
【问题讨论】:
-
请edit您的问题包含minimal reproducible example,它不会按预期为您提供生成的ID。
-
实际上,似乎每个存储过程都已停止工作(例如,插入时总是返回 0)。非常奇怪的是,当我手动执行插入时,索引恢复得很好。但是当它通过存储过程执行时,它总是 0。唯一改变的是我重新启动了我的系统。而已。注意这是我的本地 127.0.0.1 MySQL 安装。为什么手动执行 INSERT 会返回 LAST_INSERT_ID() 但完全相同的插入的存储过程会失败?
-
听起来像是会话范围问题。为什么不简单地将存储过程中的 LAST_INSERT_ID() 作为 OUT 参数返回?
-
我愿意。它已经工作了数周。问题是无论插入如何,它现在在任何存储过程中总是返回 0。使用了数周的相同代码 - 唯一的区别(正如我所提到的)是我重新启动了我的系统。是否有任何理由 LAST_INSERT_ID() 在 SP 中总是返回 0,但在不使用 SP 中的事务的情况下手动执行?就好像重新启动关闭了某些东西。
-
@Floobinator 请edit 您的问题包括表结构和存储过程作为minimal reproducible example 您的问题。还要添加有关如何调用存储过程以及如何读取
LAST_INSERT_ID()值的语句。有关 SQL 相关问题,请参阅meta.stackoverflow.com/questions/333952/…。
标签: mysql