ホームページ  >  記事  >  データベース  >  mysql の update ステートメントは何を返しますか?

mysql の update ステートメントは何を返しますか?

WBOY
WBOYオリジナル
2022-05-19 16:24:027721ブラウズ

mysql の update ステートメントの戻り結果: 1. データベース URL に "useAffectedRows=true" パラメーターがない場合は、一致する行の数が返されます; 2. "useAffectedRows=" パラメーターがある場合は、一致する行の数が返されます。データベース URL の true" パラメータは、影響を受ける行の数を返します。

mysql の update ステートメントは何を返しますか?

このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。

mysql の update ステートメントは何を返しますか?

update ステートメントの結果が返す一致する行の数は何ですか?それとも行数に影響するのでしょうか?

まず結果について話しましょう。データベースの URL が

jdbc:mysql://gitlab.fzghjx.com:3306/cron

の場合、返される結果は number の一致する行 (一致した行数) です。 )。

次の場合:

jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true

、影響を受けた (変更された) 行の数が返されます。

要約:

URL に useAffectedRows=true パラメーターがない場合、一致する行の数が返されます。存在する場合、影響を受ける行の数が返されます。

戻り値を影響を受ける (変更された) レコードの数にするにはどうすればよいですか?

mysql データ接続 URL パラメーターに useAffectedRows=true を追加するだけです

jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true

知識を広げる:

推測

#mysql の update 文を cmd で操作すると、実際の画面表示は次のようになります。

この問題を考えると、まず次のようなことが考えられます。レスポンスに対する回答は2つ 1. mysqlサーバーの戻り結果で判定 trueに設定した場合はRows matchedの値を返し、falseに設定した場合はChangedの値を返します。 2. クエリ ステートメントに戻るときに、この値を選択します。

#確認

図を使用して、接続を作成するプロセス全体を説明しましょう。

(写真は https://blog.csdn.net/c929833623lvcha/article/details/44517245 から引用)

しばらく勉強した後、次のことがわかりました。二つの考え すべて間違っています。具体的には:

簡単な jdbc クエリを書きました:

1, 接続を確立します

Accordingソース コードと追跡では、mysql が接続を確立するときに、パラメーター

useAffectedRows=true

が接続属性として設定されます。

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

に従ってください:

続き: 接続メソッドは java.sql.Driver#connect とその実装です。 com.mysql.jdbc.NonRegisteringDriver#connect

##useAffectedRows=true は com.mysql.jdbc.NonRegisteringDriver#parseURL メソッドで読み取られ、プロパティ props に設定されます。

さらに下: com.mysql.jdbc.ConnectionImpl#getInstance で connectiong のインスタンスを取得します。

#これはリフレクションです。引数は 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 に設定されており、読み取りはコミットされています)

In このコンストラクターでは、useAffectedRows の値が接続に初期化されます。

設定するプロパティは 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 の値は:

つまり、下位ビットの最後から 2 番目の桁の値は

または 演算を実行します。 useAffectsRows の場合、 または 操作は実行されません。

設定後、mysqlOutput ソケット経由で mysql サーバーに送信します。

mysqlOutput ソース: MysqlIO のビルド時に作成されます。

わかりました。これは簡単なプロセスです。次に、TCP メッセージを見てみましょう:

4、メッセージ分析:

useAffectedRows=true:

Send request To mysql サーバー:

# mysql サーバーからの応答:

# #useAffectedRows の場合=false:

##mysql サーバーにリクエストを送信:

#Mysql サーバーの応答:

上記のメッセージからわかるように、useAffectedRows が true と false の場合、msyql サーバーの戻り値は異なります。最後に、jdbc によって取得される戻り結果は、メッセージ内の影響を受ける行の値です。 msyql の結果から直接取得した jdbc は、結果に対して解析とフィルタリングを実行するだけです。これは、最初の推測が間違っていたことを証明します。

推奨学習: mysql ビデオ チュートリアル

以上がmysql の update ステートメントは何を返しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。