【问题标题】:Codeigniter 2.1 - return ids after insert batchCodeigniter 2.1 - 插入批处理后返回ID
【发布时间】:2013-03-28 14:56:11
【问题描述】:

如何在 insert_bunch 之后返回所有 ID?功能:

public function insert_slike($id, $slike, $folder, $polje, $tabela)
{
        $slike = explode(',', $slike);
        $i = 1;
        $data = array();
        foreach ($slike as $slk) {
            $this->img_upload_resize($slk, $folder);
            $data[] = array(
                $polje => $id,
                'path' => $slk
                );
            $i++;
        }

        $this->db->insert_batch($tabela, $data);
}

【问题讨论】:

  • 如果有人同时运行单次插入和批量插入会发生什么?会得到正确的身份证?例如批处理正在运行,表中的 id 类似于 - 1,2,3,4,此处单次插入,6。它会在批量插入时返回 - 1,2,3,4,6 还是 1,2,3,4,5,6?参考 Alester 的答案,您可能知道吗

标签: php codeigniter


【解决方案1】:

这是一个有效的方法:

由于您的记录有结果 ID,我假设它们也会自动递增。

如果是这种情况,您执行此操作并仍然使用 insert_batch。

这是你要做的:

1.您计算要插入的项目数:

$count = count($data);

2. 运行批量插入:

$this->db->insert_batch($table, $data);

3。获取您的批次的第一个插入 ID:

$first_id = $this->db->insert_id();

4. 将计数(减 1)添加到插入 ID 以获取最后一条记录 ID。

$last_id = $first_id + ($count-1);

给你!您现在有了插入记录的第一个和最后一个 ID,并且通过扩展,还有介于两者之间的所有其他内容。

注意:

有些人问如果两个批量插入同时发生会发生什么; InnoDB 将智能管理新行的 ID,以防止数据交叉,从而保持此方法有效。

【讨论】:

  • 如果同时有 2 个插入查询会发生什么?
  • @machineaddict 这就是我的想法。当 2 个用户同时插入两个查询时会发生什么。帮忙?
  • 对于 2 个简单的查询,我认为他们需要排队。但是如果 2 个批量插入查询同时相交会发生什么?
  • 据我所知,innoDB 会妥善管理数据的分布以防止数据交叉。
  • @Alastor 如果有人同时运行单次插入和批量插入会发生什么?会得到正确的身份证?例如批处理正在运行,表中的 id 类似于 - 1,2,3,4,此处单次插入,6。它会在批量插入时返回 - 1,2,3,4,6 还是 1,2,3,4,5,6?
【解决方案2】:

之前已经讨论过这个关于 MySQL 的话题:

How can I Insert many rows into a MySQL table and return the new IDs?

在 CodeIgniter 中,使用 $this->db->insert_id() 将只返回第一个插入的 id。

如果我这样做,我会打开一个事务并一次插入一个,在每次插入后存储 id。

【讨论】:

  • 比其他的都好。
  • 如何更好?单独插入是一种非常低效和缓慢的方法。
  • 是的,性能明智的是批量插入,获取第一个 id 并手动添加它,因为 InnoDB lock auto-inc(默认设置)。来源:dev.mysql.com/doc/refman/5.7/en/…
【解决方案3】:

1.创建自己的 ID 而不是自动生成的。

2.插入你生成的id

3.有一个插入ID的数组

4.返回插入ID的数组

【讨论】:

    【解决方案4】:

    insert_batch() 函数仅返回批次的第一个 ID。 在 for 循环中使用 insert() 函数来获取所有 id。

    public function insert_slike($id, $slike, $folder, $polje, $tabela)
    {
        $slike = explode(',', $slike);
        $data = array();
        $ids = array();
        foreach ($slike as $slk) {
            $this->img_upload_resize($slk, $folder);
            $data = array(
                 $polje => $id,
                 'path' => $slk
                 );
            $this->db->insert($tabela, $data);
            $ids[]=$this->db->insert_id();
        }
    }
    

    【讨论】:

    • 请问您能否扩展此答案以提供示例用法?
    • 公共函数 insert_slike($id, $slike, $folder, $polje, $tabela) { $slike = explode(',', $slike); $数据 = 数组(); $ids = 数组(); foreach ($slike as $slk) { $this->img_upload_resize($slk, $folder); $data = array( $polje => $id, 'path' => $slk ); $this->db->insert($tabela, $data); $ids[]=$this->db->insert_id(); } }
    猜你喜欢
    • 2017-04-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2012-01-15
    相关资源
    最近更新 更多