【问题标题】:SQL avoid duplicate being inserted into staging/temp tableSQL避免重复被插入到登台/临时表中
【发布时间】:2017-05-09 07:50:51
【问题描述】:

我有一个处理 CSV 文件上传并将它们插入数据库的站点。 CSV 模板有 229 个字段,每个文件有多个行。由于有多行,有时两个 CSV 文件有来自前一个文件的记录,我想避免重复。

我目前将 CSV 文件上传到 230 个字段的临时表(比 CSV 多一个字段,用于自动递增主键),然后将它们拆分为较小的表。

我的问题:上传 CSV 时,我希望覆盖或忽略任何已经存在的记录,以便我只有一个 229 字段记录。

有没有办法只在临时表上执行此操作,这样我就不必担心较小的表?

【问题讨论】:

  • 你看过on duplicate key 语法吗?除非我弄错了,这就是你要找的东西?

标签: mysql csv


【解决方案1】:

如果您之前导入的所有记录都在临时表中,您可以使用以下内容:

select *
from `table`
group by Col1, Col2, Col3 [,...]
having count(*) = 1
order by id asc;

基本上,选择所有记录,然后按要区分它们的每一列对它们进行分组,并按组计数过滤结果(其中组计数> 1 有多个相同记录)。 之后,您只需过滤掉新添加的记录。

但请记住,如果同一 csv 文件中可能存在重复项,则此方法将跳过它们。如果是这种情况,您可以先对数据集使用 distinct。

【讨论】:

  • 我想我最初倾向于distinct,只是因为领域太多。这很奇怪,但是这些 CSV 文件都有几行,每行都有 229 个字段,所以为了方便起见,我将每个文件都导入到 230 个字段的临时表中,然后拆分为更小的字段。由于我们现在正在使用一个 CSV 进行测试,因此每次上传时它都会不断填满,我们必须截断。我可以先使用 distinct 来检查多个字段吗?比如,工单号、序列号、帐号和日期是否相同?
  • @TomN。 distinct 仅应用结果集中存在的字段。因此,如果您想区分所有列,则必须使用 select distinct *,如果您只想区分几个字段,请使用 select distinct field1, field2, filed3 [, ...]
【解决方案2】:

首先将文件中的数据加载到 temp_table 中,然后运行查询

SELECT * FROM temp_table INTO target_table 
WHERE temp_table.value NOT IN (SELECT value FROM target_table)

这里的 temp_table.value 是你定义的值,如果你复制的行已经存在于 target_table 中

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多