MySQL - 比较两个表并生成一个diff SQL文件

时间:2015-11-20 17:36:03

标签: mysql

在我的数据库中,我有一个默认表(名为" mytable"),我从互联网上下载。该表有100行和10列(字段)。

我正在更改表格中的某些值,但我没有删除或插入任何行或列。

说,在表格的第五行,我改变了字段" Name"的值。来自" Fox"到"熊"。

然后我再次从互联网上下载表格,然后将其添加到具有不同名称的数据库中。

所以现在我有桌子" oldtable" (包含默认值)和" mytable",其中只有一行中的字段被更改。

现在,我想向其他人展示我在数据库中所做的更改,并向他们提供他们可以运行的SQL脚本,以便他们应用相同的更改。我不能给他们自己的" mytable"因为他们无法使用它。他们也有它,并且他们认为合适的是它们改变了一些价值。他们不想要我的桌子,他们只是想在他们已经对桌子做出的改变之外应用我所做的更改。

所以我可以给他们这个名为" patch.sql":

的文件
connect myDatabase;
update mytable set name="Bear" where name like "Fox";

但是,我想创建一个" patch.sql"自动生成文件,因此我不必记住我已更改的内容并手动编写脚本。程序可以检查两个表之间的差异并自动生成该SQL文件。

是否可以在MySQL控制台或任何其他现有工具中执行此操作?

更新:该表有一个主键。

1 个答案:

答案 0 :(得分:1)

如果您使用同事编辑不同的行,脚本可能很容易。

但是如果你认为你可以编辑相同的行但是不同的列,那么它就像下一个:

你有2张桌子

TABLE_1:

id, col1, col2, col3
1   10  50  1
2   10  60  9
3   12  50  3
4   12  60  4
5   11  70  5

TABLE_2:

id, col1, col2, col3
1   20  50  1
2   30  60  2
3   12  60  3
4   12  60  5
5   15  77  22

并运行此脚本:

SELECT CONCAT('UPDATE table_1 SET '
                , CASE WHEN t1.col1 != t2.col1 THEN CONCAT(' col1 = ', t2.col1) ELSE '' END
                , CASE WHEN t1.col1 != t2.col1 AND t1.col2 != t2.col2 THEN ', ' ELSE ''END
                , CASE WHEN t1.col2 != t2.col2 THEN CONCAT(' col2 = ', t2.col2) ELSE '' END
                , CASE WHEN t1.col3 != t2.col3 AND (t1.col2 != t2.col2 OR t1.col1 != t2.col1) THEN ', ' ELSE ''END
                , CASE WHEN t1.col3 != t2.col3 THEN CONCAT(' col3 = ', t2.col3) ELSE '' END 
                , CONCAT(' WHERE id = ', t1.id)) as update_txt
FROM table_1 t1 JOIN table_2 t2 ON t1.id = t2.id WHERE t1.col1 != t2.col1 OR t1.col2 != t2.col2 OR t1.col3 != t2.col3

您的结果将是:

UPDATE table_1 SET  col1 = 20 WHERE id = 1
UPDATE table_1 SET  col1 = 30,  col3 = 2 WHERE id = 2
UPDATE table_1 SET  col2 = 60 WHERE id = 3
UPDATE table_1 SET  col3 = 5 WHERE id = 4
UPDATE table_1 SET  col1 = 15,  col2 = 77,  col3 = 22 WHERE id = 5

然后您只需要将结果列复制到文本文件并发送到其他部分。

这是UPDATE的工作,如果你计划INSERT / DELETE行,脚本会更复杂,但使用相同的逻辑