2016-11-30 8 views
0

私は、一度に1つだけ選択でき、トグルすることができるボタンのセットを持っています。つまり、ユーザーが選択したボタンを選択すると再度選択を解除する必要があります。
私のテーブルはbuttons_iduser_idvalueカラムにあり、buttons_iduser_idは(一緒に結合された)主キーです。
だから私はbuttons_id場合は、テーブルに、選択しvalueを挿入Mysql INSERT ...値が異なる場合の重複キーの更新else delete

  • にしたい、user_idコンボが存在しない(insert into
  • 更新記録buttons_id場合、
  • on duplicate key updateuser_idコンボが存在し、値が異なっています
  • buttons_iduser_idコンボが存在し、値が同じ(delete ?
ある場合レコードを削除

これはどのように行うことができますか? caseon duplicate key updateの中に使用できますか?

+0

一言でこのアクションは、文の中で最初に書くことです。 – FDavidov

+0

ボタンの状態は、変数(またはボタンコンポーネント自体)でアプリで最もよく処理されるものです。それ以外の場合は、更新後にデータベースを再度照会して、現在アクティブなボタンを確認する必要があります(ただし、アプリでこれを押しただけです)。特定のボタンを押すだけで他のボタンが選択解除されないため、あなたのアプローチがうまくいかない場合でも、ただ1つのボタンだけをアクティブにすることができます。したがって、 'user_id'(主キー)ごとに1行、' button_id'として最後に押されたボタン、 'value'として(知られている)状態を更新してください。 – Solarflare

答えて

1
あなたは、トランザクションを使用する必要があります

は(あなたのテーブルはInnoDBのような、トランザクションストレージエンジンを使用することが必要です):

  1. スタートトランザクション。これは通常、最もよく使用しているものは何でもAPIへの適切な呼び出しを介して行われますが、あなたは絶対にSQLでそれをしなければならないならば、あなたは行うことができます:現在の値を発見する

    START TRANSACTION 
    
  2. 問題locking read

    SELECT `value` FROM `table` WHERE buttons_id = ? AND user_id = ? FOR UPDATE 
    
  3. 上記で受け取った結果に従って、クライアントアプリケーションでビジネスロジックを実行します。つまり結果がない場合はINSERT、の場合はvalue、の場合はと一致してください。

  4. トランザクションをコミットします。あなたはSQLでそれをやっている場合は、再度、これは通常、最高のAPI呼び出しを介して行われますが、私はあなたが[INSERT/UPDATE]と[削除]することができる方法を見ない

    COMMIT 
    
関連する問題