【发布时间】: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