2011-08-01 75 views
4

我使用PHP将95个新行添加到我的MySQL数据库并返回新的行ID。执行时间大约需要24秒。如果我超过30秒,PHP将停止执行(默认时间限制为30秒)。有没有更好的方法来返回多插入最后插入的ID?

我需要返回插入的每行的行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(); 
    } 

为了减少insettion时间,我希望我可以在一个查询 插入多行根据MySQL(向下滚动到红色林德和单词重要)它说:

如果您将使用一个INSERT语句多行, LAST_INSERT_ID()返回第一个插入的 仅排产生的价值。

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

有没有人在类似的解决方案?任何关于如何让这一点更有效的建议?

+0

有使用内置的方法PHP获取最后插入的id http://php.net/manual/en/function的例子.mysql-insert-id.php –

+0

@Sumair Zafar,这就是'$ this-> db-> lastInsertId()'使用PDO。 – Steven

回答

0
  1. 锁表
  2. 添加使用一个“插入”
  3. 解锁表数据
  4. 得到最后插入的id
  5. 其他id也可以被计算:id[n]=last_insert_id+n,其中n是你插线的数量
+0

只是一个快速提示:“lastInsertId”似乎有可能返回已插入的第一行或最后一行的ID。这取决于服务器配置中的某些内容。我不知道这可以改变,但我有两种行为。不过,它固定在系统基础上,所以如果你尝试第一次时你会得到第一个 - 不是随机的:) – BlaM

+0

-1这很容易出错。如果某个'insert' stmt失败了,这些数字将会被关闭。更不用说并发事务了。更何况锁定一个表从来都不是一个好主意。 –

+0

不应该3.和换4.? –

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); 

再有这样的语句来抓取IDS:

SELECT @id1, @id2, @id3, ... 
+0

您可以使用'@ids:= CONCAT(@ids,',',LAST_INSERT_ID())'获取未知的ID号! @Steven – MohaMad