在SQLite中有没有办法测试两个表是否相同?

时间:2018-05-26 05:08:50

标签: sqlite

假设两个表位于同一个文件中。所以问题是,除了他们的名字,表格是相同的,即相同的模式,相同的内容。

2 个答案:

答案 0 :(得分:1)

要比较表模式,请查看sqlite_master table中的语句:

SELECT sql FROM sqlite_master WHERE tbl_name IN ('This', 'That');

您必须在比较中忽略表名本身;如果您有任何包含表名的列名或注释,则自动替换会更难。

要比较内容,只需使用compound queries检查是否有任何行不在另一个表中:

SELECT NOT EXISTS (SELECT * FROM This
                   EXCEPT
                   SELECT * FROM That)
   AND NOT EXISTS (SELECT * FROM That
                   EXCEPT
                   SELECT * FROM This);

答案 1 :(得分:0)

我相信以下内容可能就足够了: -

/*
   Compare Schema and data in tables.

     t1 is the SQL for the first table (mytable) with the table name changed to a common name (table)
     t2 is the SQL for the second table (mytable_copy1) with the table changed to a common name (table)
     (so if t1 and t2 are equal then the schema is the same)

     tablecompare is the logical result of comparing the data of each table with the other table
     except matching rows so if no rows exists then NOT EXISTS will be true (1) AND the two
     and the result will be 1 if both tables exactly match each other.

*/

SELECT 
    (t1 = t1) AND tablecompare  AS test FROM 
            (SELECT 
                replace(sql,'mytable','table') AS t1, -- change the table name to a common name
                replace(sql,'mytable_copy1','table') AS t2, -- change the table name to a common name

                (
                    SELECT NOT EXISTS (SELECT * FROM mytable EXCEPT SELECT * FROM mytable_copy1) 
            AND NOT EXISTS (SELECT * FROM mytable_copy1 EXCEPT SELECT * FROM mytable) 
                ) AS tablecompare
                FROM sqlite_master WHERE name = 'mytable'
) 
  • 请注意,这些表是mytable和mytable_copy1,因此会更改这些表以反映这两个表。

也许不那么混乱(或许更多)是这个更长篇大论的解决方案: -

/*

   Table Compare

     t1 is the SQL for the first table (mytable) with the table name replace by table
     t2 is the SQL for the second table (mytable_copy1) again table name change to table
     So if t1 = t2 then the schema is identical

     t1count is the number of rows in the first table 
     t2count is the number of rows in the second table
     So if the counts are the same then the tables may be identical

     unioncount is the count of the union of the two tables (not union all) so duiplicates are dropped
     therefore if unioncount is the same as either of the table counts then tables are identical
     NOTE!!! this assumes tables are not WITHOUT ROWID tables (would have to omit the inclusion of rowid NOT TESTED)
     the inclusion of rowid could be dropped (NOT TESTED) if there is an alias of rowid.
*/
SELECT 
    t1 = t1 AND t1count = t2count AND t1count = unioncount AS test FROM 
            (SELECT 
                replace(sql,'mytable','table') AS t1, -- change the table name to a common name
                replace(sql,'mytable_copy1','table') AS t2, -- change the table name to a common name

                (SELECT count() FROM mytable) AS t1count, -- get the number of rows
                (SELECT count() FROM mytable_copy1) AS t2count, -- get the number of rows
                (SELECT count() AS unioncount FROM
            (SELECT rowid,* FROM mytable UNION SELECT rowid,* FROM mytable_copy1)) AS unioncount
                FROM sqlite_master WHERE name = 'mytable'
) ;

如果表格匹配0,则两个解决方案都会返回单行/列结果1。

然而,它可以,但是进行单独测试的时间更少/资源更少。例如如果模式不匹配则不执行任何操作,否则检查行计数,如果它们不匹配,则不进行实际检查数据的最终检查。

测试以下表格用于测试: -

对于mytable和mytable_copy1: -

enter image description here

以上两者按照以下方式生成1: -

enter image description here

和: -

enter image description here

当下表(mytable_copy2突出显示已更改的数据)时: -

enter image description here

结果是: -

enter image description here

和: -

enter image description here