在没有第二个查询的情况下生成自动增量ID(MySQL)

时间:2013-08-14 18:38:32

标签: c++ mysql mysql-connector

我一直在搜索如何从“INSERT。INTO ......(...)VALUES(...)”获取生成的自动增量ID。即使在stackoverflow上,我也只能在后续查询中找到使用“SELECT LAST_INSERT_ID()”的答案。我发现这个解决方案不能令人满意,原因有很多:

1)这将有效地将发送到数据库的查询加倍,特别是因为它主要是处理插入。

2)如果多个线程同时访问数据库会发生什么?如果多个应用程序同时访问数据库怎么办?在我看来,价值观必然会变得错误。

我很难相信MySQL C ++连接器不会提供Java连接器以及PHP连接器提供的功能。

1 个答案:

答案 0 :(得分:0)

取自http://forums.mysql.com/read.php?167,294960,295250

的示例
sql::Statement* stmt = conn->createStatement(); 
 sql::ResultSet* res = stmt->executeQuery("SELECT @@identity AS id"); 
 res->next(); 
 my_ulong retVal = res->getInt64("id");

简而言之,如果您的ID列不是auto_increment列,那么您也可以使用

SELECT @@identity AS id

修改

不确定第二次查询/往返是什么意思。首先,我认为你试图了解一种不同的方式来获取最后插入行的ID,但看起来你更想知道是否可以保存往返行程?

如果是这样,那么我完全赞同@WhozCraig;您可以在inser into tab value ....;select last_inserted_id()这样的单个语句中打入您的查询,这将是一次调用

OR

你可以像下面这样存储过程来做同样的事并保存往返

create procedure myproc
as 
begin
insert into mytab values ...;

select last_inserted_id();
end

如果这不是您想要实现的目标,请告诉我。