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 IGNORE
Active 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)
更新:这不适用于批处理查询,一次只能运行一行.
由于我也遇到了类似的问题,我最终选择了一个比下面更为"优雅"的解决方案.一个完整的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()快,但比每个条目的单个查询更快.我希望它能帮助别人.
对于批量上传,您可能需要更多类似的内容:
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)
归档时间: |
|
查看次数: |
31411 次 |
最近记录: |