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

时间:2013-10-21 19:11:35

标签: php mysql sql

这是我目前的情况:

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

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


TB1
+---------------+---------------+---------------+---------------+
| id            | col1          | col2          |col3           |
+---------------+---------------+---------------+---------------+
| 1             | value1        | val-A         |false          |
| 2             | value2        | val-B         |false          |
| 3             | value1        | val-C         |false          |
| 4             | value3        | val-D         |false          |
| 5             | value4        | val-E         |false          |
+---------------+---------------+---------------+---------------+



TB2
+---------------+---------------+---------------+---------------+
| id            | col1          | col2          |col3           |
+---------------+---------------+---------------+---------------+
| 1             | value1        | val-A         |true           |
| 2             | value2        | val-B         |false          |
| 3             | value1        | val-C         |true           |
| 4             | value3        | val-D         |false          |
+---------------+---------------+---------------+---------------+

正如您所看到的,TB1有一个额外的行id = 5。 col1和col2的组合是唯一的,这就是我想要检测的,所以TB1.col1和TB1.col2的任何新组合都应该复制到TB2,同时保留TB2.col3。

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

SELECT TB1.col1, TB1.col2 FROM (
SELECT TB1.col1, TB1.col2 FROM TB1
UNION ALL
SELECT TB2.col1, TB2.col2 FROM TB2
) TB1
GROUP BY TB1.col1
HAVING count(*) = 1
ORDER BY TB1.col1

我知道我错过了INSERT部分,但是对这两者或至少SELECT的任何帮助都将非常感激。

感谢名单!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我会这样做:

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

使用eggyal告诉的唯一键,因为从我记忆中INSER IGNORE忽略所有失败的插入,这可能是col3不需要的。

答案 2 :(得分:1)

不要认为我的sql中的Minus可用,但外连接应该可以使用

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);

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

相关问题