MySQL DBAL:如何为多行插入获取所有最后一个插入ID?

时间:2016-12-01 19:06:01

标签: mysql symfony dbal

我想稍微加速我的系统,并在一个更大的插入中进行一些插入。 目前我在for循环中将一些项插入到db中,但是如果我从插入中创建一个sql-query并在过程结束时插入它们,这将有助于我减少所需的时间。连接到MySQL数据库,因为不需要为每个项目建立新的连接。

问题:我需要来自这些插入的自动增量ID。现在我可以使用lastInsertId()函数来获取它们,但只有当我逐个插入它们时才会使用它们。

问题1:甚至可以从多行-insert中获取所有AI-id?

问题2:如果无法从多行插入中获取ID,只要所有项目都已保存,是否可以保持连接打开?

Maybe1 ...:我想也许我可以获得多行插入的最后一个插入ID,然后根据我制作的插入数来计算其他id。但我不确定mysql是如何工作的。如果有许多其他连接,是否有可能其他连接获得应属于我们当前连接的一些AI值?这最终会出现我应该有id的情况:1,2,3,但是其他连接偷走了其中一些,我们最终得到:1,3,5,因此,计算将不起作用。我不是MySQL的专家,我在文档中找不到合适的解释。

Maybe2 ...:我还在想,如果所有其他方法都失败了,我可以使用SELECT -query获取刚插入的id。如果要插入的项目超过2个,这可能比原始方式更快。或者可以吗?数学将是我在一个查询中插入3个项目并获得刚插入的id与一个,VS我在3个查询中插入3个项目。但什么时候这是无意义的优化和实际节省时间的功能?

条件: 我正在使用Symfony2 -framework和Doctrine DBAL进行连接。一个项目有20列的数据。 1/3的列是TINYINT,1/3是不同长度的VARCHARS,但通常我们讨论的是5-15个字符串的短字符串。并且1/3的列是INT和DOUBLE也是小值。一次可插入1到60个项目。我认为大约90%的插页在一个会话中大约有1-6个项目。

更新

我一直在测试它,似乎DBAL没有关闭连接,但默认情况下重新使用已创建的连接。这很好。 我还测试了在一个查询中插入多个项目VS一次插入一个。结果不是我的预期。我插入了多少项并不重要,但花费的时间大致相同。这引发了一个问题:为什么?有人可能认为100个插入单独比一个插入100行慢,但事实并非如此。有没有人对这种行为有任何见解?为什么它不像我想的那样工作?

0 个答案:

没有答案