有没有更好的方法返回多插入的最后插入ID?

时间:2011-08-01 09:53:51

标签: php mysql pdo

我正在使用PHP向我的MySQL数据库添加95个新行并返回新的行ID。执行时间大约需要24秒。如果我超过30秒,PHP将停止执行(默认时间限制为30秒)。

我需要返回插入的每一行的行ID,以便我可以使用它来安装相关数据。

我目前的解决方案是:

  /* snippets from my class objects to illustrate my code */

  // This foreach takes 24 seconds on just 95 rows
  foreach($list as $row) {
    $id = $this->importRows($sid,$table)

    array_push($id_list,$id);
  }

  /* PDO insertion */
  protected function importRows($row) {
    $sql = "INSERT INTO my_table (name, colour)
            VALUES $row['name'], $row['colour']";

    $result = $this->db->exec($sql);
    return $this->db->lastInsertId();
  }

为减少插入时间,我希望我可以在一个查询中插入多行 根据{{​​3}}(向下滚动到红色的lind和“重要”一词),它说:

  

如果使用单个INSERT语句插入多行,   LAST_INSERT_ID()返回为第一个插入生成的值   只排。

他们建议的解决方案是创建另一个表并插入新的ID,然后我可以通过最后的select语句获取新的id。

有没有人参与类似的解决方案?关于如何使这个时间更有效的任何建议?

2 个答案:

答案 0 :(得分:3)

这是我以前在这种情况下使用的技巧:

$query = "INSERT INTO my_table (name, colour) VALUES";
$i = 0;
foreach( $rows as $row ) {
    if( $i ) $query .= ',';
    $query .= " ( $row[ 'name' ],
              IF( @id$i := LAST_INSERT_ID(), $row[ 'colour' ], $row[ 'colour' ] ) )";
    ++$i;
}
$result = $this->db->exec( $query );

然后有这样的查询来获取ID:

SELECT @id1, @id2, @id3, ...

答案 1 :(得分:0)

  1. 锁定表
  2. 使用一个'insert'
  3. 添加您的数据
  4. 解锁表
  5. 获取最后一次插入ID
  6. 可以计算其他ID:id[n]=last_insert_id+n,其中n是插入行的编号