更新MySQL中的标记映射表

时间:2012-02-21 20:52:37

标签: mysql tags tagging

我有一个MySQL标记映射表,其结构来自以下帖子 - Recommended SQL database design for tags or tagging

我有两列 - TagID和ItemID。我想对某个项目进行更新(更改它的标签)。例如,我有ID = 1的项目,tagID为1,2,3。但在更新用户想要的只有ID为3,4,5的标签。显然我必须删除“1”和“2”,保留“3”并添加“4”和“5”。

最简单的方法/最优雅的方法是什么(使用INSERT INGORE'S,on DUPLICATE UPDATE或MySQL的其他“功能”)?

删除所有并重新插入所有“新”标签或通过它们全部删除/插入?它将是最小1,最多5个标签。或者对于如此少量的标签/操作真的无关紧要?

1 个答案:

答案 0 :(得分:6)

如果你肯定最多有五个标签,包括它们在表格中作为tag1,tag2,tag3,tag4,tag5绝对是“最简单的”。为了更加简单,您可以只更新所有5个值,因此标记3,4,5保存到tag1,tag2,tag3,tag4和tag5保存为NULL。显然它不具有可扩展性 - 你绝对不希望用大量(或可能无限制的)标签来做到这一点。

下一个最简单的方法是删除all并重新插入,但它不是特别优雅。

我能想到的最优雅的方式是运行两个查询。第一个将删除不是您的新标签集的所有内容。我已将您的示例扩展为显示添加两个替换标记:(3,4,5,6,7)。 下一个将插入所有新标签,但将忽略重复项,基于TagID和ItemID的UNIQUE组合索引。

#This creates the table and UNIQUE index, so you can understand how the next queries work
CREATE TABLE `taglinks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ItemID` int(11) NOT NULL,
  `TagID` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `Linkindex` (`ItemID`,`TagID`)
);

#This inserts example data
INSERT INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5);

#This removes tags 1 and 2
DELETE FROM `taglinks` WHERE `ItemID` = 1 AND `TagID` NOT IN (3,4,5,6,7);

#This adds two new tags (6 and 7). Tags 3, 4 and 5 are unaffected
INSERT IGNORE INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,6),(1,7),(1,3),(1,4),(1,5);