问题是:
我们接管了一个有活跃会员社区的网站。我们已经获得了应用程序和数据库转储,并已在新服务器上成功运行站点,并且已切换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中的成员。我需要将它们合并在一起,保持成员1的原样,并允许成员2的唯一电子邮件插入成员1。
我认为有一些SQL可以做到这一点,但我不知道它可能是什么。
我的第二种方法是使用像PhpMyAdmin这样的工具在某个日期之后从members2导出所有记录,并将它们重新导入members1,但问题是它们都是从members2导出的,并且idmembers与members1冲突(因为在这两种方法中都使用了自动增量)
最佳答案
如果我正确理解你的问题,这里有两个不同的问题:
将来自members2的全新成员记录添加到members1
更新members1中的email字段(如果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'在成员1迁移期间没有更改!如果发生这种情况,这些查询将不起作用。)
(注意3:如果您遇到Note2中的“different idmember keys”问题,您仍然可以使用查询,但是将比较和联接操作更改为使用电子邮件字段。但之后必须先执行第二个查询以防止重复)