我要做的是插入记录,然后停用具有相同ID的先前记录,因为它们将不再使用。但是,我希望以最简单的方式做到这一点。删除记录确实不是一种选择。
尝试的操作顺序:
inUse = 1
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作为目标时切换回来言。
答案 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_id
和page_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