【问题标题】:MySQL LAST_INSERT_ID Returns 0 in Stored Procedure but not Manually ExecutedMySQL LAST_INSERT_ID 在存储过程中返回 0 但未手动执行
【发布时间】: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


【解决方案1】:

所以这个问题似乎与 dbForge Studio 2019 for MySQL 有关。我相信它在 IDE 中创建了实例调用,可以在级联调用中抛出 LAST_INSERT_ID() 。一旦我能够追踪并解决返回错误索引的错误(但与完全不相关的 INSERT 无关),一切都会恢复正常。所以看来这个问题是由IDE引起的。花了大约 3 个小时才弄清楚,因为 dbForge 中内置的实际调试器是问题的一部分。 叹息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多