【问题标题】:Mysql INSERT ... on duplicate key update if value is diffrent else deleteMysql INSERT ...如果值不同则重复键更新否则删除
【发布时间】:2017-04-14 11:14:28
【问题描述】:

我有一组按钮,一次只能选择其中一个,并且可以关闭它们,这意味着如果用户再次选择一个选定的按钮,它应该被取消选择。
假设我的表有 buttons_id、user_id 和 value 列,buttons_id 和 user_id 是主键(连接在一起)。
所以我想

  • 如果buttons_id,user_id 组合不存在,则将选定的value 插入表中 (insert into)
  • 如果存在buttons_id,user_id 组合并且值不同,则更新记录 (on duplicate key update)
  • 如果buttons_id,user_id组合存在且值相同则删除记录(delete ?)

我怎样才能做到这一点是一个单一的查询?我可以在on duplicate key update 中使用case 吗?

【问题讨论】:

  • 我看不到可以在单个语句中 [INSERT/UPDATE] 和 [DELETE] 的方法。请注意,动作是您在语句中编写的第一件事。
  • 按钮状态最好在您的应用程序中以变量(或按钮组件本身)的形式处理。否则,您必须在更新后再次查询数据库以查看现在哪个按钮处于活动状态(尽管您只是在应用程序中按下它)。如果只有一个按钮可以激活,据我了解,您的方法将不起作用,因为按下特定按钮不会取消选择其他按钮。因此,只需为每个user_id(主键)更新一行,最后按下的按钮为button_id,其(已知)状态为value(或者如果你真的想切换到数据库,则使用case)。

标签: mysql insert duplicates


【解决方案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 不同,则发出UPDATE,如果value 匹配,则发出DELETE。

  4. 提交交易。同样,这通常最好通过 API 调用来完成,但如果您在 SQL 中进行:

    COMMIT
    

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多