2016-11-30 18 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 
    
相关问题