MySQL LAST_INSERT_ID在存储过程中返回0,但不是手动执行

问题描述 投票:0回答:1

更新2:如果我将下面的EXECUTE代码示例手动替换为要执行的实际SQL代码,则可以正常工作,这告诉我对于PREPARE,EXECUTE和DEALLOCATE PREPARE这个问题很累。

UPDATE 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')

问题是,每次我在存储过程中执行SQL语句时,LAST_INSERT_ID()每次都返回0,但是如果我手动执行它,则LAST_INSERT_ID()返回的索引就很好。请注意,我正在执行INSERT的表具有正确定义的PK自动增量索引,因此这不是问题(这似乎是导致0结果的#1原因)。

更令人发疯的是,这个完全相同的代码之前完全可以正常工作-它没有改变-我所做的唯一一件事就是将其放在更大的存储过程中,并向BEGIN添加了一个Label(因为我在出错时执行LEAVE) 。

当我遍历代码时,它执行得很好;它只是LAST_INSERT_ID()现在总是返回0,即使记录插入得很好(以及递增的ID /索引)。

有什么想法吗?

mysql
1个回答
0
投票

因此似乎此问题与MySQL的dbForge Studio 2019有关。我相信它正在IDE中创建实例调用,该调用可以在级联调用中抛弃LAST_INSERT_ID()。一旦我能够找到并解决了返回错误索引的错误(尚未影响完全未关联的INSERT),一切都将恢复正常。因此,似乎此问题是由IDE引起的。花了大约3个小时来弄清楚,因为dbForge中内置的实际调试器是问题的一部分。 叹气

热门问题
推荐问题
最新问题