跨两个数据库导入/导出表的某些列并排除 mysql 中的重复电子邮件
Posted
技术标签:
【中文标题】跨两个数据库导入/导出表的某些列并排除 mysql 中的重复电子邮件【英文标题】:Import/Exporting certain columns of a table across two databases and excluding duplicate emails in mysql 【发布时间】:2015-05-14 05:09:39 【问题描述】:我遇到了 mysql 查询的问题:
基本上,我有两个数据库,它们都包含一个名为 tblclients
的表,但是 db1 的记录比 db2 多得多,并且还有一些重复的记录(在两个数据库中都有电子邮件地址的用户将被排除在手术)。我打算将 db1 附加到 db2,只要找不到电子邮件地址,就只附加某些列。
我已经完成了这个 mysql,但它给了我一个错误。首先它抱怨没有选择数据库,即使我输入使用db1
;在实际语句之前,它会产生另一个错误:
第 1 行出现错误 1064 (42000):您的 SQL
语法有错误;检查与您的MySQL
服务器版本相对应的手册,以在第 1 行的db1.tblclients (db1.tblclients.firstname, db1
附近使用正确的语法
对此有什么看法吗?
有人告诉我改用 mysqldump,但我相信它可以在 bash 脚本文件中使用的单行 mysql 查询中完成。
谢谢
INSERT INTO db1.tblclients
(db1.tblclients.firstname,
db1.tblclients.lastname,
db1.tblclients.companyname,
db1.tblclients.email,
db1.tblclients.address1,
db1.tblclients.address2,
db1.tblclients.city,
db1.tblclients.state,
db1.tblclients.postcode,
db1.tblclients.country,
db1.tblclients.phonenumber,
db1.tblclients.password,
db1.tblclients.authmodule,
db1.tblclients.authdata,
db1.tblclients.status,
db1.tblclients.pwresetkey,
db1.tblclients.pwresetexpiry,
db1.tblclients.emailoutput)
VALUES (SELECT db2.tblclients.firstname,
db2.tblclients.lastname,
db2.tblclients.companyname,
db2.tblclients.email,
db2.tblclients.address1,
db2.tblclients.address2,
db2.tblclients.city,
db2.tblclients.state,
db2.tblclients.postcode,
db2.tblclients.country,
db2.tblclients.phonenumber,
db2.tblclients.password,
db2.tblclients.authmodule,
db2.tblclients.authdata,
db2.tblclients.status,
db2.tblclients.pwresetkey,
db2.tblclients.pwresetexpiry,
db2.tblclients.emailoutput
WHERE NOT EXISTS (SELECT db2.tblclients.email
WHERE db2.tblclients.email =
db1.tblclients.email));
【问题讨论】:
【参考方案1】:试试
insert into db1.tblclients
(
firstname, lastname, companyname,
email, address1, address2, city, state,
postcode, country, phonenumber, password,
authmodule, authdata, status, pwresetkey,
pwresetexpiry, emailoutput
)
select
firstname, lastname, companyname,
email, address1, address2, city, state,
postcode, country, phonenumber, password,
authmodule, authdata, status, pwresetkey,
pwresetexpiry, emailoutput
from db2.tblclients
where not exists
(
select 1
from db1.tblclients
where email = db2.tblclients.email
)
【讨论】:
最后一个 ) 是不必要的,所以你刚刚拯救了我的一天,谢谢!【参考方案2】:我只是简单化了表结构,但想法必须足够清楚:
create table t1 (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(30),
name VARCHAR(30));
create table t2 (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(30),
name VARCHAR(30));
INSERT INTO t1 (email, name)
VALUES ('one@example.com', 'name1'), ('two@example.com', 'name2');
INSERT INTO t2 (email, name)
VALUES ('one@example.com', '2name1'), ('three@example.com', '2name3');
INSERT INTO t1 (email, name)
SELECT t2.email, t2.name from t2
LEFT JOIN t1 on t1.email = t2.email where t1.id IS NULL;
SQLFiddle sample
【讨论】:
你能推荐一些通用的吗?我不想使用 one@example.com,因为记录太多 什么意思?哪里的记录太多了?这是一个简单的示例:从 table2 中排除一些存在于 table1 中的记录,左连接 table2 并通过与 NULL 比较来过滤它。使用这种方法的例子很多,这里有一个***.com/a/4560613/4786219以上是关于跨两个数据库导入/导出表的某些列并排除 mysql 中的重复电子邮件的主要内容,如果未能解决你的问题,请参考以下文章