mysql中update語句回傳什麼

WBOY
發布: 2022-05-19 16:25:00
原創
7721 人瀏覽過

mysql中update語句的回傳結果:1、當資料庫的url中沒有「useAffectedRows=true」參數時,傳回符合行數;2、當資料庫的url中有「useAffectedRows=true」參數時,傳回影響行數。

mysql中update語句回傳什麼

本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。

mysql中update語句回傳什麼

update語句的結果到底是符合行數?還是影響行數?

先說結果:如果資料庫的url為:

jdbc:mysql://gitlab.fzghjx.com:3306/cron
登入後複製

則,傳回結果為匹配行數(Rows matched)。

若為:

jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true
登入後複製

則傳回的是影響行數(Changed)。

綜上:

如果url中沒有  useAffectedRows=true  這個參數,則回傳的就是符合行數。如果有,則傳回的是影響行數。

如何讓其傳回值為受影響(changed)的記錄數呢?

只需在mysql資料連接url參數加useAffectedRows=true即可

jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
登入後複製

擴充知識:

猜想

如果透過cmd操作mysql的update語句,螢幕上顯示其實是這樣的:

#當我想這個問題的時候,第一反應有兩個答案,1,在mysql伺服器的回傳結果中,進行判斷,如果有這個設定為true,則傳回Rows matched的值,如果為false,則傳回Changed的值。 2,在傳回給查詢語句的時候,進行這個值的選擇。

證實

借用一個圖表來說明建立connection的整個過程:

##(圖片摘自:https://blog.csdn.net/c929833623lvcha/article/details/44517245)

##當我研究了一段時間之後,我發現,這兩種想法都錯了。具體來看:

我寫了一個簡單的jdbc查詢:

1,建立Connection

根據原始碼,追踪,在mysql建立connection的時候,會將

useAffectedRows=true

這個參數設定為connection的屬性。

Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");
登入後複製

往下追蹤:

#繼續:connect方法為:java.sql.Driver#connect,實作為: com.mysql.jdbc.NonRegisteringDriver#connect

useAffectedRows=true是在com.mysql.jdbc.NonRegisteringDriver#parseURL方法讀取,並設定到  Properties props中去的。

再往下:com.mysql.jdbc.ConnectionImpl#getInstance取得connectiong的實例

##這裡是一個反射,args為  JDBC_4_CONNECTION_CTOR   

用到的是JDBC的建構子:

JDBC的建構函數,是:

public JDBC4Connection(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) throws SQLException {
    super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url);
}
登入後複製
往上找,是ConnectionImp的建構子:

(順便一提:這裡設定了交易的隔離等級為2,讀取已提交)

在這個建構子裡,將  useAffectedRows的值初始化到connection中去了:

這裡有206個屬性要設置,useAffectedRows排在190位(不同的mysql-connect -java版本,位置不一樣)。

設定完成之後:

2,建立MysqlIO

設定完屬性之後,就要建立MysqlIO了:

這裡有一個「高可用」的選項,如果是的話,就會建立一個重試的IO連結。否則,則創建一個只嘗試一次的IO鏈接,失敗了就不會重試。這個選項,也是在url中,透過設定:autoReconnect=true來開啟的。

3,與msyql伺服器握手連接

連接IO過程,其實就是創建一個MysqlIO,然後開始握手:

##重點來了:在doHandshake方法中,設定了useAffectedRows的選項:(com.mysql.jdbc.MysqlIO#doHandshake)

這個CLIENT_FOUND_ROWS的值為:

##這個CLIENT_FOUND_ROWS的值為:

也就是低位的倒數第二位的值進行運算。如果useAffectsRows,則不會進行

操作。

設定完之後,透過mysqlOutput的socket傳送給mysql 伺服器:

mysqlOutput來源:在MysqlIO建置的時候建立的。

ok,這是一個簡單的過程。接下來,來看tcp的封包:

4,封包分析:

useAffectedRows=true時:

傳送請求給mysql伺服器:

mysql伺服器的回應:

useAffectedRows=false時:

發送請求給mysql伺服器:

##mysql伺服器的回應:

從以上封包可以看出,當useAffectedRows為true和false時,msyql伺服器的回傳值是不同的

。最後jdbc取的回傳結果,就是封包中,Affected Rows的值 。直接從msyql的結果中獲取,jdbc只是對結果進行了一些解析和過濾。由此證明,最開始的猜想是錯的。

推薦學習:mysql影片教學

####

以上是mysql中update語句回傳什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板