merge into语句操作一个表产生重复记录的问题

阳二快跑 2014-01-06 04:12:26
需求:
产品评分表,一个产品同一个用户只能评一次分,且以最后一次为准。
最开始使用的方式是先update,如果影响行数为0,则进行插入。
后面修改为一条sql实现(mybatis):
MERGE INTO P_GRADE P0
USING DUAL
ON (P0.PRODUCT_ID = #{productId} AND P0.USER_ID = #{userId})
WHEN MATCHED THEN
UPDATE SET UPDATE_TIME = SYSDATE, USER_GRADE = #{userGrade}
WHEN NOT MATCHED THEN
INSERT
(PRODUCT_ID, CREATE_TIME, USER_GRADE)
VALUES
(#{productId}, #{userId}, SYSDATE, #{userGrade})

在测试环境中,用户少,没有产生重复的数据,但在正式环境就产生了产品id和用户id重复的数据(1%左右)。
请问merge into适用这个场景吗? 如果可以的话应该怎么改进这个sql。如果不适用的话,还有什么比较高效的方式来实现?
...全文
1157 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 youaremoon 的回复:
数据都是用户产生的,都是新出现的重复数据,不是已经有的
试试加个唯一约束,然后再检验一下是什么情况下出现重复了
alter table P_GRADE add constraint uq_pg_1 unique(PRODUCT_ID ,USER_ID)
阳二快跑 2014-01-07
  • 打赏
  • 举报
回复
数据都是用户产生的,都是新出现的重复数据,不是已经有的
阳二快跑 2014-01-07
  • 打赏
  • 举报
回复
引用 3 楼 gioh0022 的回复:
是不是你的数据本身就有重复了
隔断时间就会有这样的数据产生,都是用这一个sql去处理的
hyee 2014-01-07
  • 打赏
  • 举报
回复
SQL本身没问题,但是在高并发情况下,假如该SQL被两个SESSION以同样的变量同时运行,就可能会出现重复。最好加约束来避免这种情况
  • 打赏
  • 举报
回复
是不是你的数据本身就有重复了
阳二快跑 2014-01-06
  • 打赏
  • 举报
回复
就在想通过这个sql来达到这个效果,这个sql只是 简化的版本,还有其他纬度的去重,单独在表上加约束不太好加进去,另外如果加约束的话,会不会产生更新也无法进行的情况?如果是的话也达不到需求
大话EPM 2014-01-06
  • 打赏
  • 举报
回复
没有主键或者约束什么的么,直接不管三七二十一就插?

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧