2009-09-04 60 views
2

问题合并两个表具有共同的唯一的字段是:在MySQL

我们已经采取了一个网站,该网站有一个活跃的成员团体。我们已经获得了应用程序和数据库转储,并且已成功在新服务器上运行该站点,并且DNS已被切换。

问题是数据库在将文件传输到我们以及切换DNS时花费的时间不同步。既然DNS已经切换了,并且数据库不会失去同步的机会,我们就把成员2交给了成员2,这是来自原始服务器的具有额外数​​据的表格。

两个表看起来像这样

`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`) 

因此,第一个表被称为成员1,是活的数据库,它是失踪members2成员的负载。我需要将它们合并在一起,保持member1原样,并允许来自members2的唯一电子邮件插入到members1中。

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

我的第二个也不太好的方法是使用像PhpMyAdmin这样的工具在特定日期后将成员2的所有记录导出并重新导入到成员1中,但问题是他们都从成员2导出,并且与成员1发生冲突(作为一个自动增量用于两者)

回答

0

只需编写一个快速移植脚本,选择“members1”中缺少的字段,然后为“members2”表中的每个字段执行INSERT。

如果您需要唯一的电子邮件地址,则可能需要进行一些检查,并且您认为可能存在重复。

1

最重要的建议是在数据库副本而不是实时数据库上执行此操作,直到确定该过程导致了正确的合并!

首先,你应该检查,看看是否有重复的电子邮件地址members2已经存在的成员1的任何行:

SELECT members2.* 
FROM members1 JOIN members2 USING (email); 

如果有任何(希望这会是少数),修复起来手动或删除每个行,这些行真的是成员1中已有帐户的人员的重复帐户(保留备份数据当然)。

如果还有任何其他冗余成员帐户的情况应该被视为重复且未作为新成员插入,则可能需要手动处理。这是数据库清理重复删除更广泛的问题的一个例子,通常不能完全自动化。

您可以从members2复制行到成员1,而产生这样的新的ID值:

INSERT INTO members1 (`firstName`, `lastName`, `email`, `date`, `source`) 
    SELECT `firstName`, `lastName`, `email`, `date`, `source` 
    FROM members2; 

是的,你的名字的所有列。通过从该查询中省略idmembers,该列将使用其默认行为来生成新的id值。

你没有说你需要更新其他通过他们的id引用这些新成员的表。如果是这样,您应该创建一个新表来将members2 id映射到您将其导入到members1中时生成的新号码。你必须遵循@ ijclarkson关于每次插入一个成员的建议,这样你可以记下生成的新ID。

SELECT * FROM members2; 

-- loop over results in a script: 

    INSERT INTO members1 (`firstName`, `lastName`, `email`, `date`, `source`) 
    VALUES (?, ?, ?, ?, ?); 

    INSERT INTO members_id_map (idmembers1, idmembers2) 
    VALUES (LAST_INSERT_ID(), ?); -- use idmembers from the query on members2 

-- end loop 
2

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

  1. 从members2添加全新成员记录到成员1
  2. 更新中成员1电子邮件字段,如果得到了改变in 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 

(注:这两个构建“特设”和未经考验的声明!)
(注2:两个语句假设主键“idmember”在成员1的迁移期间没有改变!如果发生这种情况,这些查询将不起作用。)
(注意:如果您遇到Note2中的'不同的成员键'问题,仍然可以使用查询,但可以更改比较和联接操作以使用电子邮件字段。那么你必须首先执行第二个查询以防止重复)