比较 2 个 MySQL 表并将新行移动到第二个表


Compare 2 MySQL tables and move new rows to second table

这是我当前的场景:

我有两个表(TB1 和 TB2),它们与一列完全相同。我有一个 CRON,它可以从远程 SQL 数据库复制所有内容并刷新 TB1 上的所有内容,删除当前行并插入新行,因此 TB1 是我的源表。

在 TB2 上,我的结构与 TB1 完全相同,但最后一行从 true 变为 false,默认值为 false。请参阅下面的示例表:

TB1+---------------+---------------+---------------+---------------+|身份证 |Col1 |Col2 |Col3 |+---------------+---------------+---------------+---------------+|1 |值1 |val-A |false ||2 |值2 |val-B |false ||3 |值1 |val-C |false ||4 |值3 |val-D |false ||5 |值4 |val-E |false |+---------------+---------------+---------------+---------------+瑞银+---------------+---------------+---------------+---------------+|身份证 |Col1 |Col2 |Col3 |+---------------+---------------+---------------+---------------+|1 |值1 |val-A |true ||2 |值2 |val-B |false ||3 |值1 |val-C |true ||4 |值3 |val-D |false |+---------------+---------------+---------------+---------------+

如您所见,TB1 有一个额外的行 id=5。col1 和 col2 的组合都是独一无二的,这就是我试图检测的,因此 TB1.col1 和 TB1.col2 的任何新组合都应复制到 TB2,同时保留 TB2.col3。

我尝试了以下内容,但它在我的情况下并不真正有效,因为它只显示所有不同的值而不是组合差异:

从 (从 TB1 中选择 TB1.col1、TB1.col2全部联盟从 TB2 中选择 TB2.col1、TB2.col2) TB1分组方式 TB1.col1计数 (*) = 1按 TB1.col1 订购

我知道我错过了插入部分,但对两者或至少 SELECT 的任何帮助将不胜感激。

谢谢!

不要认为减号在我的 sql 中可用,但外部连接应该可以工作

http://sqlfiddle.com/#!2/e73e4/1/0

Insert into tb2 (
Select tb1.ID, tb1.Col1, tb1.Col2, tb1.Col3 from tb1 
LEFT JOIN tb2 on Tb1.col1=tb2.col1 and Tb1.col2=tb2.col2
Where tb2.col1 is null);

但我可能错过了你所追求的东西......

(col1, col2) TB2中定义唯一键后,您可以使用INSERT IGNORE ... SELECT

INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1;

我会这样做:

INSERT INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1 ON DUPLICATE KEY UPDATE col3=col3;

使用Eggyal告诉的唯一键,因为据我所知,INSER忽略忽略所有失败的插入,这可能是Col3不需要的。