2009-09-16 49 views
1

我有一个加/减系统,用户可以在博客文章中添加一个或减去一个。更新表中REPLACE INTO时间戳

我的数据库(MySQL的)表看起来像这样: 用户ID 条目号 投票 - 这是+1或-1 的timeStamp

我已经设置了时间戳默认CURRENT_TIMESTAMP。

我必须加上方法plus()和minus()。两者都做同样的事情,但一个插入到'投票',另一个插入-1。由于(userid,entryid)是主键,因此我正在使用REPLACE INTO。 INSERT INTO带来重复错误。 INSERT IGNORE不会让用户从+1改变投票为-1

"REPLACE INTO votes(userid, entryid, vote) VALUES(:uid,:eid, -1)"; 

忽略值..

虽然REPLACE INTO作品完美,我被戳订货,所以当有人点击在投票后第二次+1时,它会更新时间戳,将其带到列表的顶部。

任何人都知道这个解决方案吗?

ps对不起的标题感到抱歉。想不到一个合适的。

回答

5

使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE Syntax,你可以执行检查联机,并且只有当投票实际上改变了更新的时间戳:

INSERT INTO 
    votes 
SET 
    userid = :uid, 
    entryid = :eid, 
    vote = :vote, 
    timeStamp = NOW() /* I'm being explicit here -- you don't need this */ 
ON DUPLICATE KEY UPDATE 
    vote = :vote, 
    timeStamp = IF(vote = :vote, timeStamp, NOW()) 
+1

你不需要引用timestamp列,因为在所有的时间戳只有在行被实际更新时才更新。如果投票结果相同,则没有更改,并且时间戳列未更新。 – longneck 2009-09-16 21:19:24