问题是:
我们接管了一个拥有活跃成员(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冲突(因为两者都使用了自动增量)
最佳答案
如果我正确理解您的问题,这里有两个单独的问题:
- 将members2中的全新成员记录添加到members1中
- 更新 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/