2012-02-21 48 views
2

我有结构的MySQL的标签映射表从下面的帖子 - Recommended SQL database design for tags or tagging更新标签映射表在MySQL

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

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

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

回答

5

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

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

我能想到的最优雅的方式是运行两个查询。第一个将删除不是您新的一组标签的所有内容。我已经扩展您的示例以显示添加两个替换标记:(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);