使用代码标志插入忽略

2022-08-30 16:26:01

我正在尝试使用Codeigniter和Active Records将几行插入MySQL表中。

网络工序代码

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

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

问题:我在活动记录中找不到等效项,也不想编辑活动记录类。还有其他选择吗?INSERT IGNORE

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

$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

答案 1

不要使用 ,因为它实际运行查询。您想要insert_stringinsert_batch

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

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


答案 2

由于我也遇到了类似的问题,我最终选择了一个更“优雅”的解决方案,如下所示。一个完整的insert_batch查询,它是使用Rocket的答案和事务的东西:

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

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


推荐