【问题标题】:How do I check if the content of a CSV was already uploaded to the database when duplicate records are allowed?允许重复记录时,如何检查 CSV 的内容是否已上传到数据库?
【发布时间】:2020-11-30 08:54:04
【问题描述】:

我有一个数据库表,其中每条记录都有一个主键 ID 和一系列不唯一的列。因此,重复记录(ID 除外)是绝对可能的并且被接受。

表格由 CSV 填充。

我想知道的是,是否有办法验证/检查 CSV 的内容过去是否已保存到数据库中?

我可以检查是否可以找到与 CSV 文件中的记录顺序完全相同的记录,但这听起来很昂贵,我什至不知道如何实施。

另一种选择是对文件进行哈希处理并在上传后将哈希存储在某处,以便我可以检查上传文件的哈希并提示该文件可能已经上传。

我愿意接受有关如何解决此问题的建议,如果没有,如何实现以粗体显示的部分(我认为 has 方法非常简单)。

谢谢!

【问题讨论】:

  • 您的哈希解决方案听起来更加优雅。存储 MD5 列表应该不会花费太多。
  • 很高兴您同意哈希方法,但这不是一个完美的解决方案。如果你有建议,我愿意接受!

标签: java sql csv


【解决方案1】:

此问题的规范解决方案是向包含所有其他列的表添加unique 索引或约束。这将防止插入重复的行。

这样一个索引的成本应该不会很大。它也比散列更灵活。例如,唯一约束可以考虑排序规则——将小写和大写字符视为相同。

当然,如果您愿意,您可以允许 重复。要检测它们,请使用常规索引。

索引的缺点是它占用了额外的空间——大约和原始表一样大。在空间是一个问题的应用程序中——因为表真的很庞大——那么散列是一种选择。但是,哈希并不是 100% 的解决方案,因为它们存在冲突:不同的值具有相同的哈希值。

【讨论】:

  • 您好,谢谢您的回答!你介意更详细地解释一下,也许用一些代码?我想到的一个例子是一个银行账户的交易清单:你可以在同一天向同一个人支付相同的金额等等,但是两个“相同”记录的 id 是不同的。我知道索引用于加快在数据库中的搜索,但我对它们并不熟悉。你将如何应用你的解决方案来解决这个问题?
  • @CapitanoGiovarco 。 . .如果您关心样本数据,请提出 问题。提供样本数据、所需结果和适当的数据库标签。你问了一个通用的问题,所以这是一个通用的答案。
  • 好吧,那就这么说吧:我读过,当唯一索引有多个列时,这些列中的值组合是唯一的。然而,这不是我想要的。如果我有例如 {id=1, amount=5€, addressee=Jack} 然后我尝试添加 {id=2, amount=5€, addressee=Jack},此插入将失败,但这不是我想要的是。我误解了你的评论吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多