MySQL JDBC row_count()數字不準確的問題

壹頁書發表於2016-07-04
實驗環境.
  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



參考:
%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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章