0

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

尝试的操作顺序:

  1. 插入带有激活的 inUse 值inUse = 1
  2. 为不再使用的同一 ID 更新以下记录:inUse = 0

我的第一个想法是运行这个查询:

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

此查询的唯一问题是,如果再次运行,它会将所有这些停用的值切换回 1。我需要特定 ID 的所有标签仅在它们被 WHERE 语句定位时才切换回。

4

2 回答 2

1

听起来像是触发器的工作。类似的东西可能会做(伪代码)?

更新处理 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;
于 2012-06-05T21:15:34.793 回答
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
于 2012-06-06T20:17:27.583 回答