php - 处理有关批量插入时重复行的反馈

标签 php mysql regex

我有一项服务,除了填写表单、上传每行代表一个项目的 csv 文件之外,还允许用户一次导入多个项目 - 使用在我的 mysql 数据库中的唯一字段下设置的 id 的实体(仅可以存在具有特定 id 的一项)。

当用户完成上传和 csv 处理后,我想提供有关其文件中的哪些项目已存在于数据库中的反馈。我决定使用 INSERT IGNORE,解析 id 的警告(正则表达式)并根据收集的 id 检索项目信息(SELECT)。浏览互联网,我没有找到通用的解决方案,所以我想知道这种方法是否正确,特别是在处理大量行(500+)时。

基本想法:

INSERT IGNORE INTO (id, name, address, phone) VALUES (x,xx,xxx,xxxx), (y,yy,yyy,yyyy), etc;

SHOW WARNINGS;

$warning_example = [0=>['Message'=>'Duplicate entry on '123456'...'], 1=>['Message'=>'Duplicate entry on '234567'...']];
$duplicates_count = 0;
foreach($warning_example as $duplicated_item) {
    preg_match('/regex_to_extract_id/', $duplicated_item['Message'], $result);
    $id[$duplicates_count] = $result;
    $duplicates_count++;
}
$duplicates_string = implode(',',$id);

SELECT name FROM items WHERE id IN ($duplicates_string);

此外,由于消息结构每次都是相同的,因此对于此任务来说,最简单且最有效的正则表达式是什么。

Duplicate entry '12345678' for key 'id'
Duplicate entry '23456789' for key 'id'
etc.

最佳答案

使用preg_match:

preg_match(
    "/Duplicate entry '(\d+)' for key 'id'/", 
    $duplicated_item['Message'], 
    $result
);
$id[$duplicates_count] = $result[1];

(\d+) 表示应捕获的数字序列 (\d)(括号内)。

<小时/>

但是,如果您可以控制数据导入方式,则可以采用更好的方法进行操作。首先,我建议首先运行 SELECT 语句来检查记录是否已存在,然后仅在需要时运行 INSERT。这可以避免在数据库端产生错误。此外,它比使用 INSERT IGNORE 更准确,后者基本上忽略插入期间发生的所有错误(错误的数据类型或长度、不可为空值,... ) :因此,它通常不是检查唯一性的好工具。

关于php - 处理有关批量插入时重复行的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54993157/

相关文章:

php - 在 Laravel/Lumen 中,为什么 catch block 没有捕获我的异常?

c# - 执行数据读取器时索引超出范围

java - 用正则表达式 ".*"替换字符串会返回替换两次

ruby 正则表达式,除了括号和方括号中的所有内容

javascript - 在 jQuery 中用 html 标记替换特定字符

php - 自定义帖子类型事件链接 - Wordpress

php - 一个斜杠在 cotation 之后添加到字符串中 - PHP

php - 设计/可视化 Mysql 数据库以避免返工

MySQL;如何重置 id 并设置新的,从

mysql - 如何加快数据加载 XML 文件到 MySQL