MYSQL更新行のキーIDを取得

3484 ワード

場合によっては、データ・テーブルにレコードのステータスを更新してから取り出す必要がありますが、更新前に唯一のレコードを確認するプライマリ・キーがなければ、どのレコードが更新されたかはわかりません.
 
例:
初心者カードを発行するプログラムがあり、データベースを設計する際によく見られるシナリオは2つあります.
方案1:1枚の表を使って、初心者カードと受領記録はすべていっしょにいて、このように主要なフィールドは初心者カード(メインキー)、ユーザーID(唯一)、受領状態(必要でない)などです
これでデータベース操作が簡単になり、直接update sqlを1本、ユーザーIDをこの表に更新して、ユーザーIDに基づいてselectを出せばいいのです.しかし、このように記録が多い場合に効率的な問題は、しばらく議論しない.
方案2:2枚の表を使って、1枚は初心者カードを保管して、もう1枚は受領記録を保管します.初心者カード表には初心者カード(メインキー)、初心者カードのステータスなどのフィールドがあります.
操作には2つの方法があります.
1つは、初心者カード表からselectで記録を出して、その状態を更新してから、受け取り記録表に挿入することです.
しかし、この方法の最大の問題は、高同時性の場合、複数のユーザーselectが同じレコードを記録し、1人だけが成功し、他の人は失敗することにある.
二つ目は、まず初心者カードから記録を更新し、この記録を取り出して受け取り記録表に挿入することです.まずupdateからselectなので高同時の場合によく適応し、
しかし、さっき更新したレコードのIDをどのように取得するかという質問に直面しました.
次のコードはstackoverflowから見つけた答えです.借りてみてください.
SET @update_id := 0; UPDATE some_table SET row = 'value', id = (SELECT @update_id := id) WHERE some_other_row = 'blah' LIMIT 1; SELECT @update_id;

まず、ユーザー変数@update_を宣言することです.id、その後updateデータを更新するときに1つ多くのフィールドを更新します.現在のプライマリ・キー値を現在のプライマリ・キー値に更新します(実際には更新されていません).プライマリ・キーフィールドを更新するのは目的ではありません.現在のプライマリ・キー値を@update_に割り当てるためです.id、これです:(SELECT@update_id:=id).(個人的には、レベルが限られているので出入りする可能性があります)
また、複数のレコードを更新した場合は以下のようにしてもよい
 
SET @uids := null; UPDATE footable SET foo = 'bar' WHERE fooid > 5 AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) ); SELECT @uids;

 
 
注意:上記の方法は、HAVING、GROUP BY、またはORDER BYのある句には適用されません.そうしないと、予想とは異なる結果が出入りする可能性があります.
公式マニュアルの説明http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html参照