You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为每个用户的每篇帖子添加默认0投票值(SQL实现)

解决投票修改的SQL方案

首先,不需要预先给所有用户所有帖子添加默认0的投票记录,这种方案会产生大量冗余数据,完全没必要。更高效的方式是利用数据库的唯一约束+插入时的更新逻辑来实现需求。

步骤1:给votes表添加联合唯一约束

先确保votes表中,同一个用户对同一个帖子只能有一条投票记录,需要给username和post_id字段添加联合唯一索引:

ALTER TABLE votes ADD UNIQUE INDEX idx_user_post (username, post_id);

步骤2:使用INSERT...ON DUPLICATE KEY UPDATE实现投票/改票逻辑

不管用户是第一次投票,还是要修改之前的投票(赞改踩、踩改赞、取消投票),都可以用同一种语法:

  • 点赞(设置vote为1):
INSERT INTO votes (username, post_id, vote) 
VALUES ('jackie', 4, 1)
ON DUPLICATE KEY UPDATE vote = 1;
  • 点踩(设置vote为-1):
INSERT INTO votes (username, post_id, vote) 
VALUES ('jackie', 4, -1)
ON DUPLICATE KEY UPDATE vote = -1;
  • 取消投票(设置vote为0):
INSERT INTO votes (username, post_id, vote) 
VALUES ('jackie', 4, 0)
ON DUPLICATE KEY UPDATE vote = 0;

为什么你的尝试有问题?

你写的INSERT INTO votes (username, post_id, vote) VALUES ('jackie', (SELECT id FROM posts), 0);会直接报错——因为SELECT id FROM posts会返回所有帖子的ID,而VALUES子句中每个字段只能接受单个值。就算强行调整语法能运行,也会给用户jackie插入所有帖子的0投票记录,既浪费存储空间,后续新发布的帖子还要手动补0,完全不现实。

内容的提问来源于stack exchange,提问作者boolie29

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:40:34