将行从srce复制到dest忽略已经存在于dest中的记录

时间:2011-09-25 21:27:20

标签: mysql

我在两个单独的数据库中有两个表,结构略有不同: destTable:姓名,地址,城市,州,邮编,国家,电子邮件,电话,公司 srceTable:公司,地址,城市,州,邮编,国家,姓名,电子邮件,电话

当我尝试使用此声明时:

INSERT INTO db1.destTable (name, address, city, state, zip, country, email, phone, company) 
SELECT company, address, city, state, zip, country, name, email, phone  
FROM db2.srceTable 
WHERE db2.srceTable.email NOT EXISTS(SELECT email  
                 FROM db1.destTable  
                 WHERE (db2.srceTable.email=db1.destTable.email)

我收到此错误:

  

#1064 - 您的SQL语法出错;查看与MySQL服务器版本对应的手册,以便在第4行'EXISTS(SELECT email FROM srceTable'附近使用正确的语法

我已经尝试了几个版本,用NOT IN替换了EXISTS,一切都会产生错误。

这个副本的秘诀是什么? (哦,我只有电子邮件字段,我担心它是一个复制品。)

谢谢,

皮特

4 个答案:

答案 0 :(得分:2)

您错过了NOT EXISTS语句中的最后一个)

INSERT INTO db1.destTable (name, address, city, state, zip, country, email, phone, company) 
SELECT company, address, city, state, zip, country, name, email, phone  
FROM db2.srceTable 
WHERE db2.srceTable.email NOT EXISTS(SELECT email  
                 FROM db1.destTable  
                 WHERE (db2.srceTable.email=db1.destTable.email))

答案 1 :(得分:0)

也许你在尝试使用NOT IN?

INSERT INTO db1.destTable (name, address, city, state, zip, country, company, email, phone)
  SELECT company, address, city, state, zip, country, name, email, phone
    FROM db2.srceTable
    WHERE db2.srceTable.email NOT IN (SELECT email FROM db1.destTable)

INSERT和SELECT语句中的列数也不同。编辑:好的,因此字段略有不同,因为我没有注意到SELECT语句中的name。我已经编辑了我的陈述,所以它现在交换名称和公司,因为我仍然无法理解原始陈述中的顺序。

答案 2 :(得分:0)

您可以在电子邮件列中创建唯一索引。

然后INSERT IGNORE INTO ...

目标中已有的记录将被忽略。不需要where子句。

答案 3 :(得分:0)

你必须在WHERE子句之后删除db2.srceTable.email并在最后添加),同时重新排序SELECT字段,你可以在列中添加混合数据

INSERT INTO db1.destTable (name, address, city, state, zip, country, email, phone, company) 
SELECT name, address, city, state, zip, country, email, phone, company
FROM db2.srceTable 
WHERE NOT EXISTS (SELECT email  
                 FROM db1.destTable  
                 WHERE db2.srceTable.email=db1.destTable.email)