在具有组合值的重复密钥更新?

时间:2015-01-28 18:39:56

标签: php mysql sql

我想知道解决以下问题的好方法。

每个主题允许访问者投票一次(但他们可能会更改投票)。我已经设置了一个包含以下值的简单表。只有VoteID是唯一/主键。 MemberID和Topic ID是外键。

VoteID   MemberID   TopicID  Timestamp   ratingvalue

我在关于重复密钥更新的事情上阅读了关于mysql的内容,但这似乎对我没有帮助,因为我正在寻找的是检查一个成员(id)是否已经对某个主题进行了投票。如果他这样做,则更新,否则插入(评级值和时间戳)。

在我实现双重查询(1)之前,检查用户是否已经投票(2)插入或更新。我以为我问社区了。

有关上述的任何想法或建议吗?

3 个答案:

答案 0 :(得分:2)

您的情况完全 on duplicate key update的目的是什么。您需要从成员和主题的唯一索引开始:

create unique index idx_votes_memberid_topicid on votes(memberid, topicid)

然后执行插入:

insert into votes(memberid, topicid, ratingvalue)
    select @memberid, @topicid, @ratingvalue
    on duplicate key update
        ratingvalue = values(ratingvalue),
        timestamp = now();

注意:您还可以将时间戳设置为当前时间,或者声明在数据更改时自动更新时间戳。为此,请参阅文档here

答案 1 :(得分:1)

如果我有一个表,一个成员只能在一个主题中投票一次,我会考虑将memberID + topicID作为该表的主键。您将确保只对一个成员进行一次投票,并且作为主键,搜索速度会更快。

有许多数据库,每个数据库都有其独特的功能,也许你的数据库有一个功能,比如sql server中的“IF NOT EXISTS”或Oracle中的“MERGE”。
就个人而言,首先解决问题然后尝试更快地完成它对我来说效果更好。

答案 2 :(得分:0)

我想了解用户是否已经投票选出了某个特定主题,究竟会更新什么内容?我以为他会被告知他已经投票赞成这个话题而不允许再投票了?

在任何情况下,我都希望在应用程序中检查它,而不是出于性能原因而依赖于数据库约束。