【问题标题】:Load data from csv and ignore duplicate record based on multiple column match mysql从csv加载数据并忽略基于多列匹配mysql的重复记录
【发布时间】:2019-04-02 15:52:42
【问题描述】:

我有一个包含 n 条记录的 csv 文件。现在我想将它导入到表中。我还想忽略重复的记录(如果特定的两列具有相同的值,则考虑重复)。我还将标题传递给查询值,以便将 reoced 插入到数据库表的适当列中

我的查询是 $header 是 csv 标头 $basePath 是 csv 的基本路径位置

  $query = sprintf("LOAD DATA local INFILE '%s' INTO TABLE table name FIELDS TERMINATED BY '`' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'   (duplicatematchcol1,duplicatematchcol1) IGNORE 0 LINES (" . implode(',', $header) . ") , addslashes($basePath));

【问题讨论】:

  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 addslashes 不是 SQL 转义方法。
  • @tadman 我在 laravel 中使用它。
  • Laravel 有一个 number of methods for safely introducing data using placeholder values。尽可能使用这种方法,并避免使用像 sprintf 这样的快速黑客攻击,它们不足以防止注入问题。
  • @tadman。我一定会在查询中使用您的输入。但是你能帮我实现mysql查询的输出吗
  • 可能是重复的:stackoverflow.com/q/12891337/1531971(如果不是,请显示并告诉我们为什么不。)

标签: php mysql database mysqli


【解决方案1】:

如果您在定义重复的列上有UNIQUE 索引,您始终可以只使用INSERT IGNORE INTO ... 方法,该方法会忽略该类型的插入错误。

IGNORE 标志即使在 LOAD DATA 查询中也应该可用。

【讨论】:

  • 实际上如果两列的值相同,记录会被认为是重复的。就像例如如果 email 和 mobile 两个字段的值相同,则记录将被视为重复。如果其中一个重复,则该记录将被视为唯一
  • 这是您需要导入然后在第二遍中删除的东西,例如DELETE FROM table_name WHERE email=mobile 或类似的东西。从技术上讲,这不是重复的记录,而是重复的字段。
  • 在我的情况下,用户一次导入数百万条记录。因此,如果我将分别运行插入和重复查询,那么我的数据库性能将受到影响。我想在单个查询中实现它。
  • 请记住,您想要的和可能的是两件不同的事情。 SQL 是一个相当基本的命令集,它不打算做任何像这样繁重的事情。您可以使用BEFORE INSERT trigger 自动执行此操作,但您不能将其作为一个命令执行。但是,即使对于大量行,从 CSV 文件中加载数据通常也很快,因此请在恐慌之前将其与实际条件进行基准测试。
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2012-02-17
  • 2019-09-17
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多