比较mysql中两个表之间的差异

时间:2009-06-04 12:58:46

标签: sql mysql

oracle diff: how to compare two tables?相同,但mysql除外。

  

假设我有两个表,t1和t2,它们的布局相同但可能包含不同的数据。

     

区分这两个表的最佳方法是什么?

更确切地说,我正在试图找出一个简单的SQL查询,它告诉我t1中一行的数据是否与t2中相应行的数据不同

看来我不能使用交叉或减号。当我尝试

SELECT * FROM robot intersect SELECT * FROM tbd_robot

我收到错误代码:

  

[错误代码:1064,SQL状态:42000]您的SQL中有错误   句法;查看与MySQL服务器版本对应的手册   在第1行的“SELECT * FROM tbd_robot”附近使用正确的语法

我在语法上做错了什么吗?如果没有,我可以使用另一个查询吗?

编辑:此外,我正在通过免费版DbVisualizer查询。不确定这可能是一个因素。

7 个答案:

答案 0 :(得分:73)

INTERSECT需要在MySQL中进行模拟:

SELECT  'robot' AS `set`, r.*
FROM    robot r
WHERE   ROW(r.col1, r.col2, …) NOT IN
        (
        SELECT  *
        FROM    tbd_robot
        )
UNION ALL
SELECT  'tbd_robot' AS `set`, t.*
FROM    tbd_robot t
WHERE   ROW(t.col1, t.col2, …) NOT IN
        (
        SELECT  *
        FROM    robot
        )

编辑:在单词周围添加`:set

答案 1 :(得分:64)

您可以使用UNION手动构建交叉点。如果两个表中都有一些独特的字段,例如ID:

SELECT * FROM T1
WHERE ID NOT IN (SELECT ID FROM T2)

UNION

SELECT * FROM T2
WHERE ID NOT IN (SELECT ID FROM T1)

如果您没有唯一值,您仍然可以展开上面的代码来检查所有字段而不仅仅是ID,并使用AND来连接它们(例如ID NOT IN(...)AND OTHER_FIELD NOT IN(...)等)

答案 2 :(得分:8)

我在此link

中找到了另一种解决方案
SELECT MIN (tbl_name) AS tbl_name, PK, column_list
FROM
 (
  SELECT ' source_table ' as tbl_name, S.PK, S.column_list
  FROM source_table AS S
  UNION ALL
  SELECT 'destination_table' as tbl_name, D.PK, D.column_list
  FROM destination_table AS D 
)  AS alias_table
GROUP BY PK, column_list
HAVING COUNT(*) = 1
ORDER BY PK

答案 3 :(得分:6)

 select t1.user_id,t2.user_id 
 from t1 left join t2 ON t1.user_id = t2.user_id 
 and t1.username=t2.username 
 and t1.first_name=t2.first_name 
 and t1.last_name=t2.last_name

试试这个。这将比较您的表并找到所有匹配的对,如果任何不匹配在左侧返回NULL。

答案 4 :(得分:3)

根据Haim的回答,我创建了一个PHP代码来测试和显示两个数据库之间的所有差异。 如果源数据库或测试数据库中存在表,也会显示此信息。 您必须更改详细信息<>变量内容。

english_header = soup.find('span', {'id': 'English', 'class': 'mw-headline'})

if english_header:
    next_sibling = english_header.parent.find_next_sibling()

    while next_sibling and not (next_sibling.name == 'h2' and next_sibling.select('.mw-headline')):
        for element in next_sibling.select('.IPA'):
            print(element)

        next_sibling = next_sibling.find_next_sibling()

答案 5 :(得分:0)

基于Haim的答案,如果您要比较两个表中存在的值,那么这是一个简化的示例,否则,如果一个表中有一行,而另一表中没有一行,它将返回它。...

花了我几个小时才弄清楚。这是一个经过全面测试的简单查询,用于比较“ tbl_a”和“ tbl_b”

SELECT ID, col
FROM
(
    SELECT
    tbl_a.ID, tbl_a.col FROM tbl_a
    UNION ALL
    SELECT
    tbl_b.ID, tbl_b.col FROM tbl_b
) t
WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b)
GROUP BY
ID, col
HAVING COUNT(*) = 1
 ORDER BY ID

因此,您需要添加额外的“ where in”子句:

  

ID IN(从tbl_a中选择ID)和ID IN(从tbl_b中选择ID)在哪里


也:

为便于阅读,如果您想指出表名,可以使用以下命令:

SELECT tbl, ID, col
FROM
(
    SELECT
    tbl_a.ID, tbl_a.col, "name_to_display1" as "tbl" FROM tbl_a
    UNION ALL
    SELECT
    tbl_b.ID, tbl_b.col, "name_to_display2" as "tbl" FROM tbl_b
) t
WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b)
GROUP BY
ID, col
HAVING COUNT(*) = 1
 ORDER BY ID

答案 6 :(得分:0)

下面的问题是比较我进行大更新之前和之后的表!

如果使用 Linux ,则可以使用以下命令:

在终端

mysqldump -hlocalhost -uroot -p schema_name_here table_name_here > /home/ubuntu/database_dumps/dump_table_before_running_update.sql

mysqldump -hlocalhost -uroot -p schema_name_here table_name_here > /home/ubuntu/database_dumps/dump_table_after_running_update.sql

diff -uP /home/ubuntu/database_dumps/dump_some_table_after_running_update.sql /home/ubuntu/database_dumps/dump_table_before_running_update.sql > /home/ubuntu/database_dumps/diff.txt

您将需要在线工具用于

  • 格式化从转储导出的SQL,

例如http://www.dpriver.com/pp/sqlformat.htm [不是我见过的最好的]

  • 我们有 diff.txt ,您必须手动采用+-显示在内部,即1行插入语句中的值。

  • 在线比较 diff.txt 中的两行-&+,将其放在在线差异工具中

例如https://www.diffchecker.com [您可以保存和共享它,并且文件大小没有限制!]

注意:如果其敏感/生产数据非常小心!

diff preview

How diff.txt will look like