代码之家  ›  专栏  ›  技术社区  ›  MultiDev

MySQL:如果已经存在,则插入或更新

  •  -2
  • MultiDev  · 技术社区  · 6 年前

    我有一个表格设置(很像WordPress usermeta 表)允许为给定用户存储键和值。

    ID UserID MetaKey MetaValue

    ID 是主自动增量列, UserID 是一个 INT 用户ID的值。

    我当前的insert语句如下:

    INSERT INTO user_meta (`UserID`, `MetaKey`, `MetaValue`) VALUES
        (5, firstkey, firstvalue),
        (5, secondkey, secondvalue)
    

    这在插入新值时有效,但是我如何更新查询,以便如果存在一行 用户标识 MetaKey 值与插入的值匹配,更新现有的 MetaValue 而不是插入新行?

    1 回复  |  直到 6 年前
        1
  •  2
  •   pulbere    6 年前

    首先,您需要为userid和metakey组合定义一个唯一的约束:

     ALTER TABLE usermeta ADD CONSTRAINT UserID_MetaKey_combination UNIQUE (UserID, MetaKey);
    

    注意:如果表中已经有非唯一的userid和metakey值组合,则无法添加约束。

    在表具有约束之后,如果userid和metakey是唯一的,则将插入以下查询,否则将更新找到的组合的metavalue:

       INSERT INTO usermeta (`UserID`, `MetaKey`, `MetaValue`) VALUES
           (5, "firstkey", "firstvalue"),
           (5, "secondkey", "secondvalue")
           ON DUPLICATE KEY UPDATE MetaValue=values(MetaValue)