テーブルにtag1、tag2、tag3、tag4、tag5を含めて最大5個のタグがある場合は、間違いなく「最も単純」になります。簡単にするために、5つの値をすべて更新するだけで、タグ3,4,5がtag1、tag2、tag3に保存され、tag4とtag5がNULLとして保存されます。明らかにそれはスケーラビリティではありません - あなたは多数の(または潜在的に無制限の)タグでそれをしたくないでしょう。
次に最も単純なのは、すべてを削除して再挿入することですが、特に優雅ではありません。
私が考えることができる最もエレガントなやり方は、2つのクエリを実行することです。最初のタグは、新しいタグセットではないすべてのものを削除します。あなたの例を拡張して、2つの置換タグを追加することを示しました:(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);