如何计算MySQL中表之间的差异?

时间:2009-01-10 12:49:43

标签: mysql database

在MySQL中的表之间计算差异(在某种意义上应该从一个表添加和删除哪些内容以获得另一个表)的好方法是什么?

3 个答案:

答案 0 :(得分:7)

迄今为止发布的答案(来自BrynJ和Vadim)都没有做得非常彻底。做彻底的工作也非常困难。两个答案都假设知道每个表中存在哪些ID号就足够了。但是,通常,表格有多个列。

我们打电话给表A和B.

一个重要问题是“两个表是否具有相同的架构”?如果没有,那么一个问题是需要将哪些列添加到A并且需要将哪些列添加到B以使它们的模式相同。这是一个元数据查询,可以从系统目录中查询。应该在添加到表中的列中插入哪些值是一个有趣的问题。

假设这些表实际上具有相同的模式,包括相同的主键和列之间相同的功能依赖性。我们还假设有一个ID列(存储一个唯一的整数),Name列(一个字符串)和一个DATE类型的RefDate列。

Table A                                 Table B
ID  Name         RefDate                ID  Name         RefDate
1   Frederick    2007-01-23             1   Josephine    2009-01-10

现在,需要从每个表中插入,删除,更新哪些内容才能使它们相同?

我认为可以公平地说,如果不了解更多的背景,就没有单一的答案。可能是弗雷德里克自2007年以来经历过性别变化手术,B中的记录代表了她的新身份。或者这可能是一个大错;数据库不应存储这两个记录。或者可能有另一种解决方案。

不幸的是,来自BrynJ和Vadim的询问都表明A和B之间没有区别,这对我来说是一个可疑的命题。

顺便提一下,请注意,当行可能具有空值时比较行比不行时更复杂。例如,考虑比较名称:

无空:

(A.Name = B.Name)

使用nulls:

(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL))

尽可能避免空值的另一个原因。

答案 1 :(得分:1)

SELECT DISTINCT id FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.id = b.id);
SELECT DISTINCT id FROM b WHERE NOT EXISTS (SELECT * FROM a WHERE a.id = b.id);

答案 2 :(得分:1)

您也可以使用左外连接(第一个告诉您表a中存在行而不是b,第二个反之亦然):

SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL
SELECT b.id FROM b LEFT JOIN a ON b.id = a.id WHERE a.id IS NULL