Mysql:在更新查询的两个条件下切换int字段的值
我要做的是插入一条记录,然后停用以前具有相同ID的记录,因为它们将不再使用。然而,我希望用最简单的方法来实现这一点。删除记录确实不是一个选项 尝试的操作顺序: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的所有标记,只有
inUse=1
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语句作为目标时,才能切换回。”所以约翰,虽然这确实是一个恰当的答案,但它不是我想要的答案。原因是您的答案需要的触发器似乎比需要的多。使用触发器调试可能会变得更困难,人们往往会忘记它们的存在。保持简单是一个很好的目标。很高兴你解决了。