使用 REPLACE INTO 更新表中的时间戳

Posted

技术标签:

【中文标题】使用 REPLACE INTO 更新表中的时间戳【英文标题】:Timestamp updating in table with REPLACE INTO 【发布时间】:2009-09-16 19:00:53 【问题描述】:

我有一个加/减系统,用户可以在博客文章之外加一或减一。

我的数据库 (mysql) 表如下所示: 用户身份 条目编号 投票 - +1 或 -1 时间戳

我已将时间戳设置为默认值 CURRENT_TIMESTAMP。

我必须使用 plus() 和 minus() 方法。两者都做同样的事情,但一个在“投票”中插入+1,另一个插入-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 抱歉标题不好。想不出合适的。

【问题讨论】:

【参考方案1】:

使用 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())

【讨论】:

您根本不需要引用时间戳列,因为只有在实际更新行时才会更新时间戳。如果投票相同,则没有变化,时间戳列不更新。

以上是关于使用 REPLACE INTO 更新表中的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的replace into 与insert into on duplicate key update

MySQL的replace into 与insert into on duplicate key update

MySQL的insert ignore与replace into不同

Replace INTO和INSERT INTO的区别

mysql replace into用法详细说明

MySQL的replace into的功能场景