所以,假设我有csv文件,我无法控制:
a.csv
b.csv
c.csv
它们都有不同的标题名称。我将所有数据转储到表a,b和c中。现在,如果我得到另一个带有新值的a.csv(相同的标题字段),我如何只插入新a的值不是旧值?
例如: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 + ")")
它工作一次(使用空表),但如果我再次运行它来测试它基本上冻结,并且永远不会完成。现在我有这些“幻影表”,如果我试图删除它说“未知表”,但如果我尝试创建它,它说“表已经存在”。我也无法在没有冻结的情况下从表中添加或删除任何内容。我将尝试再次给它一个独特的索引。感谢你们所有人的帮助!
答案 0 :(得分:0)
您可能希望将表更新为具有唯一索引:
ALTER IGNORE TABLE MyTable ADD UNIQUE INDEX idx_name (name, age);
完成后,它应该在插入时自动过滤重复的行。您可能需要处理异常。
解决方法可能是在加载所有CSV文件之前删除索引。上传数据后,重新应用索引以删除重复记录。
答案 1 :(得分:0)
怎么样:
insert into MyTable select * from temp where (tempcolumn1, tempcolumn2, ..., tempcolumnn) not in (select * from MyTable)