【问题标题】:MySQL Many to Many with Unique keys and Update/Select if Exists otherwise InsertMySQL 多对多,具有唯一键,如果存在则更新/选择,否则插入
【发布时间】:2010-05-09 04:39:06
【问题描述】:

为了在我的 MySQL 数据库中建立多对多关系的目标,我已经到达了另一个要构建的桥梁。

当前表:
用户(ID、姓名)
标签(ID、名称)
User_Tags (user_id, tag_id)

这是目标:
我希望能够获取标签,即:#fb 并将其插入到我的 Tags 数据库中,该数据库对 name 具有唯一约束,如果标签存在,我想返回它是 id

我想将tag.id 和当前用户的user.id 插入User_Tags。我对User_Tags 表没有任何独特的限制,因为我希望能够跟踪用户最常用的标签并将它们显示在按使用频率排序的列表中。

我目前正在使用准备好的语句在 PHP 中开发这个项目。
此外,性能目前不是问题,因为我的用户数量仍然很少,但它正在稳步增长,将来可能会成为问题。

【问题讨论】:

    标签: php mysql many-to-many select-insert


    【解决方案1】:

    你可以使用 MySQL 的 ON DUPLICATE KEY UPDATELAST_INSERT_ID(expr) 来获取标签 id,无论它是被插入还是已经存在,例如

    INSERT INTO
      Tags
      (name) 
    VALUES
      (:name)
    ON DUPLICATE KEY UPDATE
      id = LAST_INSERT_ID(id)
    

    INSERT INTO
      User_Tags
      (user_id, tag_id)
    VALUES
      (:userid, LAST_INSERT_ID())
    

    【讨论】:

    • 完美;有没有办法做到ON DUPLICATE KEY SELECT
    • 我不知道,也许我过度优化了;但据我了解,读取比写入便宜。所以如果我不用写,我会更好地阅读,对吧?
    • 是的,但在违反唯一约束的情况下,第一条语句不会导致写入操作。如果你有一个像UPDATE foo SET x=x 这样的语句,MySQL 没有写任何东西,你甚至会得到affected_rows()=0。与on duplicate key update 相同,旧值=新值=> 没有写操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多