Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 选择多个插入行的最快方法_C++_Mysql - Fatal编程技术网

C++ 选择多个插入行的最快方法

C++ 选择多个插入行的最快方法,c++,mysql,C++,Mysql,我在数据库中有一个存储项目的表。每个项目都有一个唯一的ID,DB在插入时自动递增生成该ID。 用户可以执行将X项添加到数据库的特定任务,但是我的程序使用MySQL连接器的C++服务器应用程序应该返回数据库生成的ID。例如,如果我添加6项,服务器必须向客户端返回6个新的唯一ID。 做这件事最快/最干净的方法是什么?到目前为止,我一直在为每个新项目执行INSERT,然后是SELECT,或者INSERT,然后是last_INSERT_id,但是如果要添加50个项目,则至少需要几秒钟的时间,这对用户体验

我在数据库中有一个存储项目的表。每个项目都有一个唯一的ID,DB在插入时自动递增生成该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

由于您的ID是自动增量的,因此只能执行两个SELECT查询-插入查询之前和之后:


这将为您提供第一个和最后一个插入的ID之间的顺序。然后你可以很容易地计算出它们的数量。

我认为你需要稍微重新考虑一下你的设计。让我们使用销售订单的类比。通过销售订单或发票,用户可以自动获取发票号以及多个行项目号

从GUI中选择要插入的销售订单和所有行项目,并执行插入。首先,插入销售订单行,并将其id保存在变量中,以便后续调用插入行项目。但是行项目只是插入,没有立即返回其auto_inc id值。应用程序最后只返回销售订单号。您的应用程序在后续通话中如何使用该销售订单号取决于您。但不需要立即检索所有X或50行,因为它将销售订单号冻结并保存在某个位置。我们把那个销售订单号叫做XYZ

当您实际需要信息时,示例调用可能如下所示

select lineItemId 
from lineItems 
where salesOrderNumber=XYZ 
order by lineItemId 
您需要记住,在多用户系统中,无法保证接收连续的数字块。这对您也不重要,因为它们都附有正确的销售订单号


同样,以上只是一个类比,用于说明。

这是一个常见但难以解决的问题。mysql不确定,但PostreSQL使用序列生成自动ID。插入框架对象关系映射器在希望插入许多值时使用这种方法:它们直接查询序列中的一组ID,然后使用那些已知的ID插入新行。这样,无需在每次插入后进行额外的查询即可获得ID


缺点是,当不同的编写器混合插入时,ID-插入时间的关系可能是非单调的。这不是数据库的问题,但有些写得很差?程序可能会这样。

请添加一些代码。好的,我添加了一些代码。这一切都很好,但一点也不快,也没那么容易。并发会话也可以增加插入ID。当然,MySQL的多主集群不会增加1。我同意rkosegi,因为我也担心这一点。如果我有一个外部工具可以将项目添加到同一个表中,而我恰好同时添加了项目,那么客户端可能会得到一些不同的ID。@rkosegi通常是的,您是对的,但这取决于具体情况。由于InnoDB在插入过程中执行锁定,因此其他插入必须等待插入完成事务(如果有)。一切都取决于实现。@mitkosoft:那么,如果它取决于实现,您如何在应用程序代码中对其进行假设?@rkosegi,so中的几乎每个解决方案都基于给定的输入和描述,我也是如此。由于在描述中没有看到任何其他依赖项和约束,我建议使用这种方法,而不是在每次非并发的描述插入之后调用db。这种类比非常好,谢谢!事实上,这甚至不是我的设计,因为我试图重现服务器的行为,但这部分令人困惑。用户可以一次购买两个项目,服务器会将它们添加到数据库中,然后为每个购买的项目向客户端返回一个唯一的ID。他们做得很快,所以我想知道我是否错过了什么。
select lineItemId 
from lineItems 
where salesOrderNumber=XYZ 
order by lineItemId