我在数据库中有一个存储项目的表。每个项目都有一个唯一的 ID,数据库在插入时生成该 ID(自动递增)。
用户可以执行将 X 项添加到数据库的特定任务,但是我的程序(使用 MySQL 连接器的 C++ 服务器应用程序)应该立即返回数据库生成的 ID。例如,如果我添加 6 个项目,服务器必须返回 6 个新的唯一 ID 给客户端。
做这种事情最快/最干净的方法是什么?到目前为止,我一直在为每个新项目执行 INSERT
后跟 SELECT
或 INSERT
后跟 last_insert_id
,但是如果有 50 个项目要添加,至少需要几秒钟,这对用户体验来说一点都不好。
sql_task.query("INSERT INTO `ItemDB` (`ItemName`, `Type`, `Time`) VALUES ('%s', '%d', '%d')", strName.c_str(), uiType, uiTime);
获取ID:
uint64_t item_id { sql_task.last_id() }; //This calls mysql_insert_id
最佳答案
我认为您需要稍微重新考虑一下您的设计。让我们用销售订单做类比。通过销售订单(或发票编号),用户可以获得发票编号 (auto_incr) 以及多个订单项编号(也称为 auto_inc)。
(从 GUI)选择销售订单和所有行项目进行插入并执行插入。首先,插入销售订单行并将其 id 保存在一个变量中,以供后续调用插入行项目。但是这些行项目只是被插入而没有立即返回它们的 auto_inc id 值。应用程序最终只返回销售订单号。您的应用程序如何在后续调用中使用该销售订单号由您决定。但不需要立即检索所有 X 行或 50 行,因为它已将销售订单号卡住并保存在某处。我们将该销售订单编号命名为 XYZ。
当您确实需要这些信息时,示例调用可能如下所示
select lineItemId
from lineItems
where salesOrderNumber=XYZ
order by lineItemId
您需要记住,在多用户系统中,无法保证接收到连续的号码 block 。这对您来说也不重要,因为它们都附有正确的销售订单编号。
同样,以上只是一个类比,用于说明目的。
关于c++ - 选择多个插入行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283782/