【问题标题】:Insert if not exist and Update if exist如果不存在则插入,如果存在则更新
【发布时间】:2015-02-01 14:58:09
【问题描述】:

我的数据库表上有三列

user_idpost_idvote

如果 user_id 和 post_id 不存在,我想插入一个新数据。但是如果两个列 user_id 和 post_id 都存在,我将能够更新“投票”列值。我将 user_id 设置为唯一但事实证明它不起作用,因为我希望用户在不同的帖子上插入投票。

下面的查询只更新了 vote 的值,因为 user_id 已经存在。当且仅当 user_id post_id 存在时,我才希望更新它

我使用了这个 sql 查询

 INSERT INTO polls (user_id,post_id,vote) VALUES (1,2,5)
  ON DUPLICATE KEY UPDATE vote= ?;

这是我的问题

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您必须创建唯一的组合键

    Create unique index your_index_name on yourtable (field_one,field_two),
    然后执行insert into , on duplicate key 逻辑

    你的代码没有按预期工作是绝对合乎逻辑的,因为你唯一的键是 user_id,因此如果你想检查 user_id 和 post_id 的唯一性,那么你应该这样设置。

    【讨论】:

    • 玩一下列,post_id是什么类型的?你先把user_id的唯一性去掉了吗?
    • 如果我删除 user_id 的唯一性,同样的问题。我希望用户对不同的帖子投票,所以如果用户已经投票给那个帖子,它只会更新他的投票而不是插入另一行
    • 给出的答案就是解决方案。我不知道您是如何设置密钥的,但请再试一次。删除 user_id 的唯一性,改为制作 user_id 和 post_id 组合键。
    • @taesu 那么我的查询会是什么样子?如果我同时删除 user_id 和 post_id 唯一性??
    【解决方案2】:

    不要认为你可以纯粹在 MySQL 中做到这一点 :*( post_id 必须是唯一的,你说这不符合你的业务逻辑。此外,如果检测到多个键,它们会由 @ 连接987654322@ 在结果查询中,这将使您的事情更加复杂。这是手册的摘录,其中abON DUPLICATE KEY 查询中涉及的键:

    如果 a=1 OR b=2 匹配多行,则仅更新一行。一般来说,您应该尽量避免对具有多个唯一索引的表使用 ON DUPLICATE KEY UPDATE 子句。

    【讨论】:

    • Kita 知道我将如何实现这一目标吗?
    • 您必须在服务器端执行此操作。首先,为user_idpost_id 这对发出SELECT。如果您找到匹配的记录,请更新它。否则做一个插入。它基本上将“这个组合是否已经存在”从 SQL 中移出并转移到您选择的服务器端语言中。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2019-10-17
    • 2012-12-13
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多