SQL如何实现指定question_id和user_id存在时更新、不存在时插入
解决方案
你的
ON DUPLICATE KEY UPDATE未生效的核心原因是:该语法仅在插入操作触发主键或唯一索引冲突时才会执行更新逻辑。当前你仅将id设为主键,没有为question_id+user_id的组合设置唯一约束,因此只有id重复时才会触发更新,不符合业务预期。
- 第一步:给
question_id和user_id创建联合唯一索引
执行以下SQL添加约束:
ALTER TABLE questions_answers ADD UNIQUE KEY `uq_question_user` (`question_id`, `user_id`);
- 第二步:使用原有插入更新逻辑即可(可做可选优化)
添加唯一约束后,你原来的SQL已经可以正常触发更新,也可以优化为更通用的写法,不用硬编码answer的值:
INSERT INTO questions_answers (question_id, answer, user_id) VALUES (1, 'no',3) ON DUPLICATE KEY UPDATE answer = VALUES(answer);
- 相关说明
这个需求完全可以纯SQL实现,不需要先用PHP查询判断是否存在。先查再写的方案存在并发安全问题,高并发场景下可能出现多个请求同时判定数据不存在、重复插入的脏数据。数据库原生的唯一索引+ON DUPLICATE KEY UPDATE是原子操作,没有并发风险。
内容的提问来源于stack exchange,提问作者user_411
相关产品推荐
相关产品推荐

