1

我有 2 个数据库,在 DB1 中只有 1 个表,在 DB2 中只有 2 个表。DB1.table1 中的每条记录都被拆分并分别存储在 DB1.table1 和 DB@.table2 中。

For example, DB1 has a table1 which looks like

        Student_Name   Id   Address   Attendance   Marks
        ------------   --   -------   ----------   -----
        John            1   90th st       70         90

The records that are transferred from DB1.table1 are stored in DB2.table and DB2.table2 in the following manner

DB2.table 1: Id   Student_Name   Address   
             --   ------------   -------
             1     John          90th st


DB2.table 2: Id   Attendance   Marks
             --   ----------   -----
             1     70            90

我想编写一个测试用例以确保将 DB1 中的所有数据复制到 DB2。我编写了一些查询来确定是否没有将 DB1 中的记录复制到 DB2。除了找出丢失的记录外,我还想逐列检查每条记录,以确保 DB1 和 DB2 中的值相同。

从上面的示例中,如果 DB2.table1 Student_name=DB1.table1 Student_name、DB2.table1 Address=DB1.table1 Address 等,我想检查 ID=1。

如果我有 1000 列怎么办?我应该写一个长脚本来检查每一列吗?不。进行这种测试的最佳方法是什么?有没有我可以使用的工具或者我应该写下脚本?

4

3 回答 3

0

此查询的结果将为您提供 DB2 中与 DB1 不同的行数,如果行不存在但它应该存在,它也会计数。如果结果为 0,则一切正常。

SELECT
    COUNT(*) AS difference
FROM
    DB1.table1 AS d1t1
    LEFT JOIN DB2.table1 AS d2t1
         USING (Id)
    LEFT JOIN DB2.table2 AS d2t2
         USING (Id)
WHERE
    (d1t1.Student_Name <> d2t1.Student_Name)
    OR (d1t1.Address <> d2t1.Address)
    OR (d1t1.Attendace <> d2t2.Attendace)
    OR (d1t1.Marks <> d2t2.Marks)
于 2012-10-02T08:00:05.577 回答
0

这将从 和 中找到任何不匹配的Id行。db1.table1db2.table1db2.table2

它假定两个表中的列名称相同,并且任何存在db2.table1db2.table2应该在db1.table1. 所以如果db2.table2有一个名为 的列Foodb1.table1也必须有一个名为 的列Foo。如果db2.table1有一个名为 的列Bardb1.table1也必须有一个名为 的列Bar。如果该列存在于db2但不存在于 中db1,您将收到 MySQL 错误。

希望这就是你要找的!

header("Content-type: text/plain");

// connect with mysqli

// get a list of columns in db2.table1 and db2.table2
$columns = array();
$query = mysqli_query("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = 'db2' AND table_name IN ('table1', 'table2')");
while ($row = $mysqli_fetch_assoc($query)) {
    $columns[$row["table_name"]][] = "db1.table1.{$row["column_name"]} = db2.{$row["table_name"]}.{$row["column_name"]}";
}

$query = mysqli_query("
    SELECT db1.table1.Id
    FROM
        db1.table1
        LEFT JOIN db2.table1
            ON ". implode(" AND ", $columns["table1"]) ."
        LEFT JOIN db2.table2
            ON ". implode(" AND ", $columns["table2"]) ."
    WHERE
        db2.table1.Id IS NULL
        OR db2.table2.Id IS NULL
");

while (list($id) = mysqli_fetch_row($query)) {
    echo "ID {$id} does not match\n";
}
于 2012-10-01T18:52:35.913 回答
0

您可以通过以下方式使用 union all 和 group 来执行此操作:

select Student_Name, Id, Address, Attendance, Marks,
       (case when max(which) = 'db1' then 'Missing in db2'
             when min(which) = 'db2' then 'Missing in db1'
        end) as why
from ((select 'db1' as which, Student_Name, Id, Address, Attendance, Marks
       from db1.table1 t
      ) union all
      (select 'db2' as which, t1.Student_Name, t1.id, t1.Address, t2.Attendance, t2.Marks
       from db2.table1 t1 join
            db2.table2 t2
            on t1.id = t2.id
      )
     ) u
group by Student_Name, Id, Address, Attendance, Marks
having count(distinct which) = 1
于 2012-10-01T18:54:30.130 回答