选择多个插入行的最快捷方式
Fastest way to select several inserted rows
我在数据库中有一个表,用于存储项目。每个项目都有一个唯一的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
我认为您需要稍微重新思考一下您的设计。让我们用销售订单来比喻。对于销售订单(或发票号),用户将获得发票编号(auto_incr)以及多个行项目编号(也称为auto_inc)。
选择销售订单和所有行项目进行插入(从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是自动递增的,您只能执行两个SELECT
查询-在INSERT
查询之前和之后:
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'dbTable' AND table_schema = DATABASE();
--
-- INSERT INTO dbTable... (one or many, does not matter);
--
SELECT LAST_INSERT_ID() AS lastID;
这将为您提供第一个和最后一个插入的ID之间的序列。然后你可以很容易地计算出它们有多少。
- 如何在c++中为模板函数实例创建快捷方式
- C++ ->运算符 [] 的快捷方式
- C++结构模板变量快捷方式定义不起作用
- 用于基于成员字段或函数创建比较器的快捷方式
- c++ Visual Studio 2015 快捷方式,用于从选择代码中生成功能
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?
- Qt全局快捷方式扩展劫持快捷方式
- 在Qt Creator中应用代码更改的快捷方式是什么?
- 是否有快捷方式重叠运算符?
- 使用 C++ 显示 (.lnk) 快捷方式文件的真实路径
- 一个按钮有两个或多个快捷方式
- 通过TranslateAccelerator检测快捷方式时,忽略Shift键的状态
- 以分类方式插入节点时遇到麻烦
- 无论如何,是否可以确定MFC应用程序是通过PC重新启动或用户单击应用程序快捷方式开始的
- QDIR入口列表可以使用文件夹快捷方式透明地工作
- 快捷方式在C 中编写自定义编译命令时
- 自动热键:重新映射 MS Visio 的快捷方式,以将手动选择的对象对齐到顶部(好像按:"AlignTop")
- 如何为 QT Windows 应用程序设置不同的桌面快捷方式图标和任务栏图标不同
- 使用快捷方式创建QACTION,而无需插入菜单
- 选择多个插入行的最快捷方式