MySQL JDBC row_count()数字不准确的问题

实验环境.
  1. create table user_follow_sender(  
  2.     UserID bigint not null comment '粉丝的用户ID',  
  3.     FollowUserID bigint not null comment '关注的用户ID',  
  4.     FollowState smallint default 1 comment '关注状态.1表示有效,0表示取关',  
  5.     CreateTime timestamp not null default current_timestamp comment '创建时间',  
  6.     UpdateTime timestamp not null default current_timestamp on update current_timestamp comment '更新时间',  
  7.     primary key (UserID,FollowUserID)  
  8. ) comment '用户关注粉丝表.发起方';  
  9.   
  10. delimiter $$  
  11. create procedure add_follow_sender(  
  12.     pUserID bigint,  
  13.     pFollowUserID bigint,  
  14.     out pRowCount int  
  15. )  
  16. begin  
  17.     insert into user_follow_sender(  
  18.         UserID,  
  19.         FollowUserID,  
  20.         FollowState  
  21.     )  
  22.     values(  
  23.         pUserID,  
  24.         pFollowUserID,  
  25.         1  
  26.     )   
  27.     ON DUPLICATE KEY UPDATE  
  28.     FollowState=1  
  29.     ;  
  30.     select row_count() into pRowCount;  
  31. end $$  
  32. delimiter ; 

如果是
Insert,row_count() 为1
Update,row_count() 为2
Update的目标值和原来一样,row_count() 为0
但如果通过 JDBC 调用,最后一种情况也会返回1,这是因为客户端连接时如果设置了 CLIENT_FOUND_ROWS 标志,会用 rows found 代替 rows affected 当做返回值,而JDBC默认是会设置该标志的。在 JDBC 连接字符串中指定 useAffectedRows=true 可以取消这个flag。

作为JDBC调用,不加useAffectedRows参数
url = "jdbc:mysql://127.0.0.1:3306/" + dbName;

  1. public void test() throws SQLException {  
  2.     Connection con = getConnection(dbPrefix + 0);  
  3.     con.setAutoCommit(false);  
  4.   
  5.     CallableStatement cs = con.prepareCall("{call add_follow_sender(?,?,?)}");  
  6.   
  7.     cs.setLong(11010001);  
  8.     cs.setLong(21010002);  
  9.   
  10.     cs.registerOutParameter(3, Types.INTEGER);  
  11.   
  12.     cs.execute();  
  13.   
  14.     System.out.println( cs.getInt(3));  
  15.     con.commit();  
  16.     cs.close();  
  17.     con.close();  
  18. }  

Insert,返回值为1
Update的目标值和原来一样,返回值为1
Update的目标值和原来不一样,返回值为2


增加 useAffectedRows参数
url = "jdbc:mysql://127.0.0.1:3306/" + dbName+"?useAffectedRows=true";

Insert,返回值为1
Update的目标值和原来一样,返回值为0
Update的目标值和原来不一样,返回值为2



参考:
http://novoland.github.io/%E6%95%B0%E6%8D%AE%E5%BA%93/2015/08/17/INSERT%20ON%20DUPLICATE%20KEY%20UPDATE%20%E5%87%A0%E4%B8%AA%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E9%97%AE%E9%A2%98.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-2121455/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-2121455/

你可能感兴趣的:(数据库,c/c++)