【问题标题】:MySQL Avoiding duplicates in table of unknown column headersMySQL避免未知列标题表中的重复
【发布时间】:2013-06-17 16:06:45
【问题描述】:

假设我有无法控制的 csv 文件:

a.csv
b.csv
c.csv

它们都有不同的标题名称。我将所有数据转储到表 a、b 和 c 中。现在,如果我得到另一个带有新值的 a.csv(相同的标题字段),我怎样才能只插入不在旧值中的新 a 的值?

例如:一个表有表头名称和年龄:

'Bob'   25
'Mary'  50

我得到一个新的 a.csv,它解析为:

'Bob'   25
'Susie' 60

如何仅添加当前表唯一的行(例如,仅将 Susie 而不是 Bob 添加到表中)?我没有每个人的特定唯一 ID,所以我不能使用主键。还有多个标题字段,所以如果我尝试使用所有标题字段作为主键,它会返回“指定的键太长”。

我需要检查整行是否唯一,如果是,则将其添加到表中。我尝试了 INSERT IGNORE,但由于缺少唯一键,我无法使其正常工作。有什么建议么?如果有帮助,我会发布任何其他信息。

当前尝试:

cursor.execute("ALTER TABLE temp ADD PRIMARY KEY" + uniqueline)
cursor.execute("INSERT IGNORE INTO " + tablename + " SELECT * FROM temp")

其中 tablename 是表的名称,temp 是发送 csv 代码的位置,uniqueline 是当前表单中的前 5 个字段(field1、field2、field 3、field4、field5)。如果少于 5 个字段,则为所有字段。

谢谢!

编辑:

cursor.execute("INSERT INTO " + tablename + " SELECT * FROM temp where " + uniqueline + " NOT IN (SELECT * FROM " + tablename + ")")

它工作一次(空表),但如果我再次运行它来测试它基本上会冻结,并且永远不会完成。现在我有这些“幻像表”,如果我尝试删除它,它会说“未知表”,但如果我尝试创建它,它会说“表已经存在”。如果不冻结,我也无法从表中添加或删除任何内容。我将尝试再次给它一个唯一的索引。不过感谢大家的帮助!

【问题讨论】:

  • 您是否有理由不能使用所有需要唯一的列作为主键?
  • 问题是40多列,所以说“Primary Key is too long”。

标签: mysql mysql-python


【解决方案1】:

您可能希望将表更新为具有唯一索引:

       ALTER IGNORE TABLE MyTable ADD UNIQUE INDEX idx_name (name, age);

一旦完成,它应该在插入时自动过滤重复的行。您可能需要处理异常。

解决方法可能是在加载所有 CSV 文件之前删除索引。上传数据后,重新应用索引以删除重复记录。

【讨论】:

  • 我试试看。这对它可以拥有的字段数量有限制吗?
  • @JonathanIbers:任何合法数量的列都应该没问题。更多细节可以找到here
  • 它给了我一个错误:“_mysql_exceptions.OperationalError: (1071, 'Specified key was too long; max key length is 1000 bytes')”。我尝试使用所有列名,但似乎我真的做不到。
  • 所以我将密钥中的字节数限制在 1000 以下,并且它有效,没有添加重复项!非常感谢!
【解决方案2】:

怎么样:

insert into MyTable select * from temp where (tempcolumn1, tempcolumn2, ..., tempcolumnn) not in (select * from MyTable)

【讨论】:

  • 我用空白表试了一下,它似乎有效。我再次运行相同的文件,只是为了检查它是否没有添加任何重复文件,并且它已经运行了 20 分钟,还没有完成任何事情。你知道有什么方法可以提高效率吗?但我认为它奏效了。
  • 这似乎很长一段时间。 ;-) 我对 MySQL 性能问题/方法不是很了解,但另一种方法是用两个表的 SELECT DISTINCT .. UNION 替换表的内容。这可能更有效。
  • 谢谢,我试试。我不知道我做了什么,但我放弃了并且 cntrl-Z'd 出来了。现在我正试图放下那张桌子并重新开始,但这花了将近半个小时,还没有成功。我必须将表大小乘以我什至无法以某种方式删除的东西。 :|不过感谢您的建议,我会试一试。
  • 我很想知道您在尝试我的第一个建议时使用的具体 SQL。
  • 已发布,提供更多信息。如果您发现任何错误,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2017-08-23
  • 2015-04-05
相关资源
最近更新 更多