3

私はしばらくの間、ストアドプロシージャに取り組んできました。最近、私はUPDATEがどのように正確に機能するのか疑問に思っています。

テーブル内の特定の行を、関連するすべての行が更新されるまで1つずつ更新するwhileループがあります。

同僚は、whileループを削除し、代わりにUPDATEステートメントを1つだけ持つことを提案しました。

しかし、これが可能かどうかはわかりませんか?ストアドプロシージャが実行されるたびにどの行が更新されるかわかりません。

更新する必要のあるすべてのIDのリストを保持するテーブル変数があり、それを更新する必要のある行を識別するためのキーとして使用します。whileループを使用せずに、すべての行を同時に更新できますか?

4

4 に答える 4

4

あなたの同僚が提案したのは、セットベースのアプローチと呼ばれています。

whileループを使用したり、行を1つずつ処理したりするのではなく、Set Basedアプローチを使用して実行します。これは、すべての面で優れており、パフォーマンスまたはメンテナンスになります。

提案されているように、それぞれのテーブルを更新するための一意の値があるため、IN句または内部結合を使用してテーブルを更新できます。

UPDATE table_to_update 
SET whatever_you_want_to_set 
From temptable 
inner join temptable on temptable.key = table_to_update.key

それがあなたにとって理にかなっていることを願っています。

于 2013-03-13T11:16:47.457 に答える
2

複数のクエリを実行すると、最終的にデータベースの速度が低下する可能性があるため、同僚は正しいです。大きなクエリはそれほど問題ではありません。この投稿の指示に従うことをお勧めします。これは、UPDATEコマンドの能力を非常によく示しています。http ://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a -single-sql-query/

もちろん、PHPで単一のクエリを作成すると、間違いを犯す可能性が高くなります。すべてをMySQL(または他に使用するもの)に直接チェックするよりも、PHPにクエリを出力させることをお勧めします。もちろん、これにはライブデータベースを使用しないでください;)

于 2013-03-13T11:14:45.833 に答える
1

はい。

私が以前に行ったことの1つはjoin、アップデートでを使用することです。奇妙に聞こえるかもしれませんが、うまくいきました。

in句またはexistsサブ選択を作成することもできます。

句の危険性の1つは、in使用する値のリストが有限であることです。過去に、SQLステートメントが長すぎて実行に失敗するという問題が発生しました。

于 2013-03-13T11:11:22.427 に答える
1

はい、できます。それを行うにはさまざまな方法がありますが、そのうちの1つは

UPDATE table_to_update 
    SET whatever_you_want_to_set 
    WHERE table_id IN (SELECT id FROM @tableVariable);

そして、あなたの同僚には重要な点があります。一般に、単一の大きなUPDATEステートメントは、個別の小さなUPDATEよりもはるかに高速に実行されます。

于 2013-03-13T11:12:24.170 に答える