sql - 在 MySql 中合并两个具有共同唯一字段的表

标签 sql mysql merge

问题是:

我们接管了一个拥有活跃成员(member)社区的网站。我们已获得应用程序和数据库转储,并且站点已成功在新服务器上运行,并且 DNS 已切换。

问题在于,在将文件发送给我们以及 DNS 切换期间,数据库已经不同步。现在 DNS 已经切换,并且数据库不可能不同步,我们已经获得了 Members2,这是来自原始服务器的带有额外数据的表。

两个表都是这样的

`idmembers` int(10) unsigned NOT NULL auto_increment,
`firstName` varchar(20) default NOT NULL,
`lastName` varchar(20) default NOT NULL,
`email` varchar(255) default NOT NULL,
`date` varchar(10) default '0',
`source` varchar(50) default 'signup'
 PRIMARY KEY  (`idmembers`),
 UNIQUE KEY `email` (`email`)

因此,第一个表称为members1,是实时数据库,缺少members2 中的成员负载。我需要将它们合并在一起,保持member1不变,并允许将来自member2的唯一电子邮件插入members1。

我假设有一些 SQL 可以做到这一点,但我不知道它可能是什么。

我的第二种也是不太优选的方法是使用像 PhpMyAdmin 这样的工具在特定日期后从members2导出所有记录并将它们重新导入members1,但问题是它们都从members2导出,其idmembers与members1冲突(因为两者都使用了自动增量)

最佳答案

如果我正确理解您的问题,这里有两个单独的问题:

  1. 将members2中的全新成员记录添加到members1中
  2. 更新 Members1 中的电子邮件字段(如果 Members2 中的电子邮件字段发生更改)

对于第一种情况,您应该能够执行以下操作:

INSERT INTO members1 ('idmembers', 'firstname', etc.)
 SELECT 'idmembers', 'firstname', etc.
  FROM members2
  WHERE idmembers NOT IN (SELECT idmembers FROM members1)

对于第二种情况,类似于:

UPDATE members1 m1 LEFT JOIN members2 m2
 ON m1.idmembers = m2.idmembers
 SET m1.idmembers = m2.idmembers
 WHERE m2.idmembers IS NOT NULL AND m2.idmembers != m1.idmembers

(注1:这两个语句都是“临时”构建的并且未经测试!)
(注2:这两个语句都假设主键“idmember”在members1迁移期间没有改变!如果发生这种情况,这些查询将不起作用。)
(注3:如果遇到注2中的“不同的idmember键”问题,您仍然可以使用查询,但将比较和连接操作更改为使用电子邮件字段。但是,您必须先执行第二个查询以防止重复)

关于sql - 在 MySql 中合并两个具有共同唯一字段的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1379464/

相关文章:

android - Android 房间数据库查询是否支持 row_number?

sql - 使用 LIMIT/OFFSET 运行查询并获取总行数

mysql - 查询导致另一表中的一行的多行

python - 在用于生产的 linux 服务器中,当我尝试安装 mysql-python 模块时出现错误

c# - 在 C# 中将多个文件合并到一个文件中最快的方法是什么?

vim - 当文件也已在外部编辑时,如何在 vim 中合并已编辑的文件?

sql - 根据 3 个表之间的关系从 IBM DB2 查找表中提取值

mysql - EasyPHP 无法连接到本地主机(端口 8080)

mysql - 如何为这个和等效的 SQL 建模——用户、订阅、期刊

将另一个数据框中的列名称替换为 R 中缺少的列名称?