如何使用CodeIgniter框架从数组中插入多行?

2022-08-30 07:00:39

我正在使用插入命令通过PHP将一个大型数据集传递到MySQL表中,我想知道是否有可能通过查询一次插入大约1000行,而不是将每个值附加到一英里长的字符串的末尾,然后执行它。我正在使用CodeIgniter框架,因此我的功能也可用。


答案 1

在MySQL中,将一个语句与多行组合在一起比每行一个语句快得多。INSERTINSERT

也就是说,听起来你可能在PHP中遇到字符串处理问题,这实际上是一个算法问题,而不是语言问题。基本上,在处理大字符串时,您希望最大程度地减少不必要的复制。首先,这意味着您希望避免串联。构建大型字符串的最快、最节省内存的方法(例如一个插入数百行)是利用函数和数组赋值。implode()

$sql = array(); 
foreach( $data as $row ) {
    $sql[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')';
}
mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $sql));

这种方法的优点是,您不会复制和重新复制到目前为止已使用每个串联组合的SQL语句;相反,PHP 在语句中执行一次此操作。这是一个巨大的胜利。implode()

如果您有很多列要放在一起,并且一个或多个列很长,则还可以构建一个内部循环来执行相同的操作,并用于将 values 子句分配给外部数组。implode()


答案 2

CodeIgniter 现在支持多重插入/批量插入。

$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name' ,
      'date' => 'My date'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name' ,
      'date' => 'Another date'
   )
);

$this->db->insert_batch('mytable', $data);

// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')

推荐