【问题标题】:Update tag-mapping table in MySQL更新 MySQL 中的标签映射表
【发布时间】:2012-03-12 04:49:35
【问题描述】:

我有一个 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 个标签。还是说这么少的标签/操作真的无所谓?

【问题讨论】:

    标签: mysql tags tagging


    【解决方案1】:

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

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

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

    #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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多