mysql两个文件比较_MySQL – 比较两个表并生成一个diff SQL文件

本文介绍了如何在MySQL中比较两个表的差异,并自动生成更新SQL脚本。通过示例展示了当表结构不变,仅部分行的某些列值发生改变时,如何构造SQL语句来更新目标表。更新后的脚本可以帮助他人应用相同的数据更改,而无需直接提供整个表。
摘要由CSDN通过智能技术生成

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

我正在更改表中的一些值,但我不删除也不插入任何行或列.

比如,在表格的第五行中,我将字段“名称”的值从“Fox”更改为“Bear”.

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

所以现在我有表“oldtable”(包含默认值)和“mytable”,其中只有一行中的字段被更改.

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

所以我可以给他们这个名为“patch.sql”的文件:

connect myDatabase;

update mytable set name="Bear" where name like "Fox";

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

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

更新:该表有一个主键.

最佳答案 如果您使用同事编辑不同的行,脚本可能很容易.

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

你有2张桌子

表格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行,脚本会更复杂,但使用相同的逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值