CodeIgniter 3导入Excel至数据库时如何跳过重复记录
解决CodeIgniter 3上传Excel跳过重复记录的问题
要实现上传Excel时自动跳过重复记录,核心是先判断记录是否已存在,再决定是否插入,同时配合数据库唯一索引做双重保障,具体步骤如下:
1. 数据库层面添加唯一约束
先给你的数据表(假设表名为your_table)的重复判断字段(比如NTN,这类标识通常具备唯一性)添加唯一索引,从数据库层面拦截重复数据:
ALTER TABLE your_table ADD UNIQUE KEY `ntn_unique` (`NTN`);
2. 修改控制器代码:读取Excel时过滤重复记录
在读取Excel每行数据后,先检查数据库中是否已存在该记录,仅将不存在的记录加入插入数组:
修改控制器uploadData方法的循环部分:
$flag = true; $i = 0; foreach ($allDataInSheet as $value) { if ($flag) { $flag = false; continue; } // 检查当前NTN对应的记录是否已存在 $is_exists = $this->import_model->check_record_exists($value['B']); if (!$is_exists) { $inserdata[$i]['SR_NO'] = $value['A']; $inserdata[$i]['NTN'] = $value['B']; $inserdata[$i]['NAME'] = $value['C']; $inserdata[$i]['BUSINESS_NAME'] = $value['D']; $i++; } }
3. 模型层添加检查方法和修改插入逻辑
在import_model中添加检查记录是否存在的方法:
public function check_record_exists($ntn) { $this->db->where('NTN', $ntn); $query = $this->db->get('your_table'); return $query->num_rows() > 0; }
然后修改importdata方法,使用INSERT IGNORE语法(即使有漏网的重复数据,数据库也会自动跳过):
public function importdata($inserdata) { if(empty($inserdata)) return false; // 替换默认INSERT为INSERT IGNORE,遇到唯一键重复时自动跳过 $sql = $this->db->insert_string('your_table', $inserdata[0]); $sql = str_replace('INSERT INTO', 'INSERT IGNORE INTO', $sql); foreach(array_slice($inserdata, 1) as $row) { $sql .= ',' . $this->db->insert_string('your_table', $row); } return $this->db->query($sql); }
补充说明
- 如果你的重复判断依据不是
NTN,可以换成SR_NO或其他唯一字段,只需同步修改检查条件和数据库唯一索引即可。 - 代码过滤+数据库约束的双重机制,既能减少无效数据库查询,又能确保最终数据无重复。
内容的提问来源于stack exchange,提问作者Moosa
相关产品推荐
相关产品推荐

