使用Codeigniter插入IGNORE

Nyx*_*nyx 25 php activerecord codeigniter

我试图使用Codeigniter和Active Records在MySQL表中插入几行.

PHP代码

$data = array('......');  // some rows of data to insert
$this->db->insert_batch('my_table', $data);
Run Code Online (Sandbox Code Playgroud)

但是,这可能会导致重复的行插入表中.为了处理重复数据的插入,我打算使用该INSERT IGNORE命令在行重复时不插入行.

问题:我找不到INSERT IGNOREActive Records中的等效项,也不想编辑Active Record类.还有其他选择吗?

以下看起来很有趣,但是如果我执行以下操作,那么查询不会运行两次吗?

$insert_query = $this->db->insert_batch('my_table', $data);  // QUERY RUNS ONCE
$insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query);
$this->db->query($insert_query); // QUERY RUNS A SECOND TIME
Run Code Online (Sandbox Code Playgroud)

Roc*_*mat 39

不要使用insert_batch,因为它实际运行查询.你要insert_string

$insert_query = $this->db->insert_string('my_table', $data);
$insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query);
$this->db->query($insert_query);
Run Code Online (Sandbox Code Playgroud)

更新:这不适用于批处理查询,一次只能运行一行.


sot*_*toz 8

由于我也遇到了类似的问题,我最终选择了一个比下面更为"优雅"的解决方案.一个完整的insert_batch查询,它使用Rocket的答案AND事务:

$this->db->trans_start();
foreach ($items as $item) {
       $insert_query = $this->db->insert_string('table_name', $item);
       $insert_query = str_replace('INSERT INTO', 'INSERT IGNORE INTO', $insert_query);
       $this->db->query($insert_query);
    }
$this->db->trans_complete();
Run Code Online (Sandbox Code Playgroud)

这也将包装事务上的所有内容,从而产生更快的查询,如执行insert_batch().那不如insert_batch()快,但比每个条目的单个查询更快.我希望它能帮助别人.


Alg*_*lor 7

对于批量上传,您可能需要更多类似的内容:

foreach ($data as $data_item) {
    $insert_query = $this->db->insert_string('my_table', $data_item);
    $insert_query = str_replace('INSERT INTO', 'INSERT IGNORE INTO', $insert_query);
    $this->db->query($insert_query);
}
Run Code Online (Sandbox Code Playgroud)

更新:使用dcostalis的版本(在下面的评论中),它将扩展得更好:-)


小智 3

使用第二个想法的技术,您可以通过循环数组并使用以下命令来生成查询:

$this->db->query($query_string);
Run Code Online (Sandbox Code Playgroud)