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

时间:2012-06-05 20:51:44

标签: mysql sql sql-update

我要做的是插入记录,然后停用具有相同ID的先前记录,因为它们将不再使用。但是,我希望以最简单的方式做到这一点。删除记录确实不是一种选择。

尝试的操作顺序:

  1. 使用有效的inUse值inUse = 1
  2. 插入
  3. 更新不再使用的相同ID的以下记录:inUse = 0
  4. 我的第一个想法是运行此查询:

    UPDATE page_tags SET inUse = IF(inUse = 1, 0, 1) WHERE page_id = 23678459 AND tag_id NOT IN (10, 4);

    此查询的唯一问题是,如果它再次运行,它会将所有这些已停用的值切换回1.我需要特定ID的所有标记仅在WHERE作为目标时切换回来言。

2 个答案:

答案 0 :(得分:1)

听起来像触发器的工作。可能会做的事情(伪代码)?

UPDATE用于处理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;

答案 1 :(得分:0)

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

page_tags.page_idpage_tags.tag_id上创建 唯一索引

更新 * page_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