龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > MySQL 技术 >

MySQL连接用法示例(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
3、数据库增量同步例子 假设我们还有一个db_src.t_users,它与db_tar.t_users结构完全相同。现网的应用策略,要求先操作db_src.t_users,确认无误后再同步到db_

3、数据库增量同步例子

假设我们还有一个db_src.t_users,它与db_tar.t_users结构完全相同。现网的应用策略,要求先操作db_src.t_users,确认无误后再同步到db_tar.t_users。所以两边数据只会存在三种情况,后面我们将分别介绍如何使用SQL连接在数据库间增量同步数据。

  1. mysql> select * from t_users;  
  2. +---------+-----------+---------+---------------------+  
  3. | iUserID | sUserName | iStatus | dtLastTime |  
  4. +---------+-----------+---------+---------------------+  
  5. | 1 | baidu | 0 | 2010-06-27 15:04:03 |  
  6. | 2 | google | 1 | 2010-06-27 15:46:51 |  
  7. | 3 | yahoo | 1 | 2010-06-27 15:46:51 |  
  8. | 4 | tencent | 0 | 2010-06-27 15:04:03 |  
  9. | 5 | netease | 0 | 2010-06-27 15:04:03 |  
  10. +---------+-----------+---------+---------------------+  
  11. 5 rows in set (0.01 sec) 

情况1:db_src.t_users存在某条记录,db_tar.t_users中不存在。策略->将前者中的记录插入到后者中。

解决该问题的SQL语句为:

  1. INSERT INTO db_tar.t_users select db_src.t_users.*   
  2. FROM db_src.t_users LEFT JOIN db_tar.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID   
  3. WHERE db_tar.t_users.iUserID IS NULL;  

同步原理其实很简单,核心SQL语句就是SELECT db_src.t_users.iUserID, db_src.t_users.sUserName, db_tar.t_users.* FROM db_src.t_users LEFT JOIN db_tar.t_users ON

  1. db_src.t_users.iUserID=db_tar.t_users.iUserID WHERE db_tar.t_users.iUserID IS NULL。如果不使用where条件检索数据,执行SQL得到结果如下:   
  2. mysql> SELECT db_src.t_users.iUserID, db_src.t_users.sUserName, db_tar.t_users.*   
  3. -> FROM db_src.t_users   
  4. -> LEFT JOIN db_tar.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID;  
  5. +---------+-----------+---------+-----------+---------+---------------------+  
  6. | iUserID | sUserName | iUserID | sUserName | iStatus | dtLastTime |  
  7. +---------+-----------+---------+-----------+---------+---------------------+  
  8. | 1 | baidu | 1 | baidu | 0 | 2010-06-27 15:04:03 |  
  9. | 2 | google | 2 | google | 1 | 2010-06-27 15:46:51 |  
  10. | 3 | yahoo | 3 | yahoo | 1 | 2010-06-27 15:46:51 |  
  11. | 4 | tencent | 4 | tencent | 0 | 2010-06-27 15:04:03 |  
  12. | 5 | netease | NULL | NULL | NULL | NULL |  
  13. +---------+-----------+---------+-----------+---------+---------------------+ 

5 rows in set (0.00 sec)加入where语句后,我们就能得到"iUserID=5"这条记录不在目标数据表中,使用insert语句可以将其插入到目标数据库中,从而完成同步操作。

情况2:db_src.t_users存在某条记录,db_tar.t_users中也存在。策略->如果两者数据不同,则修改后者的记录。

这里有个问题,就是如何判断这两条记录是否不同。我们可以采用逐个字段比较的方法,但字段较多的时候就不好使用了。简单点的方法是规定修改db_src.t_users时,必须同时将db_src.t_users.dtLastTime修改为当前时间,以后就可以通过比较dtLastTime来判断数据是否不同。

根据上述判断方法,解决该问题的SQL语句为:

  1. select CONCAT('UPDATE db_src.t_users SET ',   
  2. 'iUserID='', db_src.t_users.iUserID, '',',   
  3. 'sUserName='', db_src.t_users.sUserName, '',',   
  4. 'iStatus='', db_src.t_users.iStatus, '',',   
  5. 'dtLastTime='', db_src.t_users.dtLastTime, '' ',   
  6. 'WHERE db_tar.t_users.iUserID='', db_src.t_users.iUserID, '';')   
  7. from db_src.t_users left join db_tar.t_users on db_src.t_users.iUserID = db_tar.t_users.iUserID  
  8. where db_tar.t_users.iUserID is not null and   
  9. db_src.t_users.dtLastTime > db_tar.t_users.dtLastTime; 

直接执行上述语句得到只是一组UPDATE的SQL,并不能直接修改db_tar.t_users,我们可以在shell命令行上执行下面的这个命令完成同步功能:

  1. mysql -Nse select CONCAT('UPDATE db_src.t_users SET ',   
  2. 'iUserID='', db_src.t_users.iUserID, '',',   
  3. 'sUserName='', db_src.t_users.sUserName, '',',   
  4. 'iStatus='', db_src.t_users.iStatus, '',',   
  5. 'dtLastTime='', db_src.t_users.dtLastTime, '' ',   
  6. 'WHERE db_tar.t_users.iUserID='', db_src.t_users.iUserID, '';')   
  7. from db_src.t_users left join db_tar.t_users on db_src.t_users.iUserID = db_tar.t_users.iUserID  
  8. where db_tar.t_users.iUserID is not null and   
  9. db_src.t_users.dtLastTime > db_tar.t_users.dtLastTime; | mysql;  

情况3:db_src.t_users不存在某条记录,但在db_tar.t_users中存在。策略->将该记录从后者中删除。

解决该问题的SQL语句为:

  1. SELECT CONCAT('DELETE FROM db_tar.t_users WHERE db_tar.t_users.iUserID=',   
  2. db_tar.t_users.iUserID, ';')   
  3. FROM db_tar.t_users LEFT JOIN db_src.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID   
  4. WHERE db_src.t_users.iUserID IS NULL; 

该SQL语句的情况和第二种情况相似,也不能直接执行。所以需要采用同样的方式使用SQL语句才能完成工作。可能已经有人看出了,还有更为简单的方法可以处理这种情况。对,确实存在!当然可以使用下面更为简洁的SQL语句:

  1. DELETE FROM db_tar.t_users   
  2. WHERE db_tar.t_users.UserID NOT IN (SELECT db_src.t_users.iUserID FROM db_src.t_users); 

以上的相关内容就是对MySQL连接用法总结的介绍,望你能有所收获。


精彩图集

赞助商链接