2016-11-30 68 views
0

我有一組按鈕,一次只能選擇其中一個,並且可以將其切換爲關閉狀態,這意味着如果用戶選擇了所選按鈕它應該被取消選擇。
可以說我的表格有buttons_id,user_idvalue列,buttons_iduser_id是主鍵(連接在一起)。
所以我想Mysql INSERT ...如果值不一致,則重複鍵更新其他刪除

  • 插入選定value表如果buttons_id,如果存在buttons_iduser_id組合user_id組合不存在(insert into
  • 更新記錄和價值是不同的(on duplicate key update
  • 刪除記錄,如果buttons_iduser_id組合存在和價值是相同的(delete ?

我該怎麼做這是一個單一的查詢?我可以在on duplicate key update內使用case嗎?

+0

我不明白的方式,你可以[INSERT/UPDATE] [刪除]在一個單一的聲明。請注意,該動作是您在聲明中首先編寫的內容。 – FDavidov

+0

按鈕狀態是最好在您的應用程序中的變量(或按鈕組件本身)中處理的。否則,您必須在更新後再次查詢數據庫,以查看哪個按鈕現在處於活動狀態(儘管您只是在應用程序中將其按下)。如果只有一個按鈕可以激活,就我所知,您的方法無效,因爲按下特定的按鈕不會取消其他按鈕。所以只需要按user_id(主鍵)更新一行,最後一個按鈕是'button_id',並且它的(已知)狀態是'value'(或者如果你真的想用db來切換case)。 – Solarflare

回答

1

你需要使用一個事務(需要您的表使用事務性存儲引擎,例如InnoDB):

  1. 開始交易。這通常是最好的通過給你使用任何API的調用適當的做,但是如果你絕對要做到在SQL那麼你可以做:

    START TRANSACTION 
    
  2. 問題一個locking read發現當前值:

    SELECT `value` FROM `table` WHERE buttons_id = ? AND user_id = ? FOR UPDATE 
    
  3. 根據上面收到的結果在客戶端應用程序中執行業務邏輯即ie問題INSERT如果沒有結果,UPDATE如果value不同或DELETE如果value匹配。

  4. 提交交易。再次,這是通常最好通過API調用完成,但如果你在SQL做:

    COMMIT