MySQL避免未知列标题表中的重复项

时间:2013-06-17 16:06:46

标签: mysql mysql-python

所以,假设我有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 + ")")

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

2 个答案:

答案 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)