Mysql:在更新查询的两个条件下切换int字段的值

Mysql:在更新查询的两个条件下切换int字段的值,mysql,sql,sql-update,Mysql,Sql,Sql Update,我要做的是插入一条记录,然后停用以前具有相同ID的记录,因为它们将不再使用。然而,我希望用最简单的方法来实现这一点。删除记录确实不是一个选项 尝试的操作顺序: 使用活动的inUse值插入inUse=1 为不再使用的相同ID更新以下记录:inUse=0 我的第一个想法是运行以下查询: 更新页面标签 设置inUse=IF(inUse=1,0,1) 其中页面id=23678459 和标签id不在(10,4)中 此查询的唯一问题是,如果再次运行,它会将所有停用的值切换回1。我需要特定ID的所有标记,只有

我要做的是插入一条记录,然后停用以前具有相同ID的记录,因为它们将不再使用。然而,我希望用最简单的方法来实现这一点。删除记录确实不是一个选项

尝试的操作顺序:

  • 使用活动的inUse值插入
    inUse=1
  • 为不再使用的相同ID更新以下记录:
    inUse=0
  • 我的第一个想法是运行以下查询:

    更新页面标签
    设置inUse=IF(inUse=1,0,1)
    其中页面id=23678459
    和标签id不在(10,4)中


    此查询的唯一问题是,如果再次运行,它会将所有停用的值切换回1。我需要特定ID的所有标记,只有当它们被WHERE语句作为目标时才能切换回去。

    听起来像是触发器的作业。像这样的东西也许可以(伪代码)

    处理重复使用previuos标记的更新:

    执行插入/更新操作:

    INSERT INTO ... ON DUPLICATE KEY UPDATE
    
    然后使用两个触发器,一个用于插入,一个用于更新

    CREATE TRIGGER tr_inuse_insert BEFORE INSERT ON page_tags
      FOR EACH ROW BEGIN
        UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id;
      END;
    
    CREATE TRIGGER tr_inuse_update BEFORE UPDATE ON page_tags
      FOR EACH ROW BEGIN
        UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id;
      END;
    

    @John p有一个不错的答案,但是他的答案需要使用触发器。对我来说,这似乎是解决手头问题所需要的。目前的工作解决办法是:

    page\u tags.page\u id
    page\u tags.tag\u id
    上创建一个唯一索引

    更新*页面id=234234*中的所有行:

    UPDATE page_tags SET inUse = 0 WHERE page_id = 234234
    
    插入标签:

    INSERT INTO page_tags (page_id, tag_id, inUse) VALUES (234234, 49343, 1) ON DUPLICATE KEY UPDATE inUse = 1
    

    您可以无条件地将
    inUse
    更新为0作为第一个查询,然后使用
    inUse=1
    插入
    。有什么理由不这样做吗?@ManieQ我想了想,但不管怎样,我仍然认为你需要一些方法来观察它,因为如果标签已经存在,我不会添加新的,我会使用现有的。所以我需要要么不停用那个标签,要么重新激活它…(编辑)约翰,谢谢你的建议。这里我看到的唯一问题是,如果标签已经存在,我想激活它以便重用(inUse=1)。为重复的标记ID添加新行毫无意义OK,这不仅仅是“插入一条记录,然后停用具有相同ID的以前记录,因为它们将不再被使用”那么简单?发布的问题还有一部分是:“我需要特定ID的所有标记,只有当它们被WHERE语句作为目标时,才能切换回。”所以约翰,虽然这确实是一个恰当的答案,但它不是我想要的答案。原因是您的答案需要的触发器似乎比需要的多。使用触发器调试可能会变得更困难,人们往往会忘记它们的存在。保持简单是一个很好的目标。很高兴你解决了。