1

DB1 に 1 つのテーブル、DB2 に 2 つのテーブルしかない 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

これにより、とに一致しないId行のsが検索されます。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

これは、unionallとgroupbyで行うことができます。

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 に答える