2012-02-21 76 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);