如何验证两个表是否具有完全相同的数据?

SiL*_*oNG 24 mysql sql

基本上我们有一个table(original table),它被备份到另一个table(backup table); 因此这两个表具有完全相同的模式.

在开始时,两个表(original tablebackup table)包含完全相同的数据集.由于某种原因,我需要验证数据集是否original table已更改.

为了做到这一点,我必须将数据集进行比较的original table反对backup table.

假设它original table具有以下模式:

create table LemmasMapping (
   lemma1 int,
   lemma2 int,
   index ix_lemma1 using btree (lemma1),
   index ix_lemma2 using btree (lemma2)
)
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现数据集比较?

更新:表没有主键.它只是存储两个ID之间的映射.

Jos*_*vis 33

您可以使用CHECKSUM TABLE并比较结果.您甚至可以更改表以启用实时校验和,以便它们可以持续可用.

CHECKSUM TABLE original_table, backup_table;
Run Code Online (Sandbox Code Playgroud)

它不要求表具有主键.

  • 注意,即使校验和相同,表也可能不同. (6认同)
  • 显然是PostgreSQL中没有的功能. (2认同)

小智 20

SELECT * FROM Table1
UNION
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)

如果您获得的记录大于两个表中的任何一个,则它们没有相同的数据.


Mik*_*son 16

我会写三个查询.

  1. 一个内部联接,用于获取两个表中存在主键的行,但其中一个或多个列的值存在差异.这会拾取原始的更改行.

  2. 左外连接用于拾取原始表中的行,但不在备份表中(即原始行中的行具有备份中不存在的主键).这将返回插入原始行的行.

  3. 右外连接用于拾取原始中不再存在的备份行.这将返回已从原始文件中删除的行.

您可以将三个查询组合在一起以返回单个结果集.如果您这样做,则需要添加一列来指示它的行类型(更新,插入或删除).

通过一些努力,您可以使用完全外部联接在一个查询中执行此操作.注意外连接,因为它们在不同的SQL引擎中表现不同.放在where子句中的谓词,而不是join子句有时可以将外连接转换为内连接.

  • "*注意外连接,因为它们在不同的SQL引擎中表现不同*" - 小心解释一下?在使用外连接时,我没有看到任何DBMS以不同的方式执行操作."*谓词放在where子句中,而不是join子句有时可以将你的外连接转换为内连接*" - 当然,如果这些谓词使用"外表"中的列,它们就会出现.将空值与常量值进行比较时,将丢弃具有空值的行. (3认同)

Jie*_*Jie 5

大多数 DBMS 支持关系代数的 DIFFERENCE 运算。在 Snowflake 中,它表示为 MINUS。所以下面的代码可以工作。第一个 MINUS 确保 Table1 中的每个元素也在 Table2 中。第二个 MINUS 确保 Table2 中的每个元素也在 Table1 中。如果查询返回零,从数学上讲,这两个表完全相同。

select count(*) from 
(
 (
  SELECT * FROM Table1
  MINUS
  SELECT * FROM Table2
 )
 UNION ALL
 (
  SELECT * FROM Table2
  MINUS
  SELECT * FROM Table1
 )
)
Run Code Online (Sandbox Code Playgroud)