【问题标题】:PHP – retrieving auto-incremented values from extended insertsPHP – 从扩展插入中检索自动递增的值
【发布时间】:2013-02-24 04:25:24
【问题描述】:

我目前正在使用$mysqli->insert_id 在插入新行时从 MySQL 表中检索自动分配的主键。这适用于单个插入。这是一个简单的例子

$result = $mysqli->query($query);
$NewPrimaryKey = $mysqli->insert_id;

但是,我(实际上是从这个网站)了解到,使用扩展插入更好地完成多个插入:

insert into table (name1,name2,name3) values 
('blah1','blah2',blah3'), 
('blah1','blah2',blah3'), 
('blah1','blah2',blah3'))

这也很有效——除非我想知道哪些键是自动分配的。

PHP 手册说:

在具有 AUTO_INCREMENT 字段的表上运行扩展插入时, mysqli_insert_id() 的值将等于 first 的值 已插入行。

我的测试似乎证实了这一点。

注意:我不想要第一个或最后一个。

我不想为了获得单独的 auto_allocated 键而不得不恢复到数千个单次插入。

有没有人知道如何进行扩展插入并取回所有分配的键(大概在一个数组中)?

我确实想到在进行扩展写入之前只读取并保留最新的现有密钥,然后计算分配的密钥的预期值,但这似乎有点夸张。

【问题讨论】:

  • 你考虑过 ORM 吗?
  • 您确定需要批量插入吗?如果这是您在应用程序中需要所有 ID 的场景,则使用批处理插入的性能优势可能可以忽略不计(因为我假设您需要这些 ID 来发出后续查询为每个项目插入相关数据)?
  • 我没有听说过 ORM。我快速浏览了一下,但这似乎是一套需要学习的新技能。我真的不想为这个单一的问题这样做,但是谢谢。
  • 我发现批量插入对性能有很大影响。我保持脚本的计时,在这种情况下,使用单次插入和批量插入之间的运行时间差异为 1.2 秒与 0.2 秒。 (不科学的)x6 差异。这在一次处理数千条记录时很重要。

标签: php mysql insert-id


【解决方案1】:

你可以计算密钥,不是吗?

$keys=array();
for($id=mysqli_insert_id();$id<=$id+$totalRecords;$id++)
   $keys[]=$id;

或者使用 ORM 之类的学说

【讨论】:

  • 那不是我,至少我不这么认为。
【解决方案2】:

我不认为你可以获得所有新插入的行 ID,但如果 insert_id 返回 first ID,你可以假设插入的 ID 是那个范围插入数量的 ID(除非出现问题,否则应该是这种情况,但是整个插入应该失败,因为它是原子的)。您还可以选择所有大于或等于新 insert_id 的 auto_increment ID。

【讨论】:

  • 我确实想到了这一点,但它似乎有点……手动,如果你明白我的意思的话。我希望会有某种基于 MySQL 的解决方案,但如果没有,我可能不得不这样做。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2017-09-24
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多