后端在插入数据发现重复如何正确的弹出警告_防止数据重复插入这样来搞

本文围绕后端数据重复插入问题展开。起因是微信小程序重复请求致数据库出现重复数据,这会造成数据冗余和服务问题。提出单库单表用唯一索引和幂等处理,分库分表用分布式锁 Redis 解决的方案,以防止数据重复插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要从三个方面讲解如何防止数据重复插入:

  1. 为啥要解决数据重复插入?
  2. 解决方案实战
  3. 可落地小总结

一、为啥要解决数据重复插入?

问题起源,微信小程序抽风 wx.request() 重复请求服务器提交数据。后端服务也很简单,伪代码如下:

class SignLogService { public void saveSignLog(SignLogDO log) { // 简单插入做记录 SignLogDAO.insert(log); }}

发现数据库会存在重复数据行,提交时间一模一样。但业务需求是不能有多余的 log 出现,这明显是个问题。

问题是,重复请求导致的数据重复插入。这问题造成的后果很明显:

  • 数据冗余,可能不单单多一条
  • 有些业务需求不能有多余数据,造成服务问题

问题如图所示:

92ffdaf2761c0668ea4aa2cb8cf3d0e3.png

解决方式:如何将 同请求 A,不执行插入,而是读取前一个请求插入的数据并返回。解决后流程应该如下:

4f4a889672ca866116ce09799b3942b8.png

二、解决方案实战

1.单库单表解决方案

  • 唯一索引 + 唯一字段
  • 幂等

上面说的那种业务场景:signlog 表会有 userid、signid、signtime 等。那么每次签到,每个人每天只有一条签到记录。

数据库层采取唯一索引的形式,保证数据记录唯一性。即 UNIQUE 约束,UNIQUE 约束唯一标识数据库表中的每条记录。另外,userid,signid,sign_time 三个组合适唯一字段。创表的伪代码如下:

CREATE TABLE sign_log(id int NOT NULL,user_id int NOT NULL,sign_id int,sign_time int,CONSTRAINT unique_sign_log UNIQUE (user_id,sign_id,sign_time))

重点是 CONSTRAINT unique_sign_log UNIQUE(user_id,sign_id,sign_time)。有个小问题,数据量大的时候,每条记录都会有对应的唯一索引,比较耗资源。那么这样就行了吗?

答案是不行,服务不够健壮。第一个请求插入成功,第二个请求直接报错,Java 服务会抛出 DuplicateKeyException 。

简单的幂等写法操作即可,伪代码如下:

class SignLogService { public SingLogDO saveSignLog(SignLogDO log) { // 幂等处理 SignLogDO insertLog = null; try { insertLog = signLogDAO.insert(log); } catch (DuplicateKeyException e) { insertLog = selectByUniqueKeys(userId,signId,signTime); } return insertLog; }}

的确,流量不是很大,也不算很高并发。重复写问题,这样处理即可。那大流量、高并发场景咋搞

2.分库分表解决方案

流量大了后,单库单表会演变成分库分表。那么基于单表的唯一索引形式,在碰到分表就无法保证呢,插入的地方可能是两个分表 A1 和 A2。

解决思路:将数据的唯一性条件放到其他存储,并进行锁控制

还是上面的例子,每天,每次签到,每个人只有一条签到记录。那么使用分布式锁 Redis 的解决方案。大致伪代码如下:

a.加锁

// 加锁jedis.set(lockKey, requestId, "NX
<think>嗯,用户问的是如何限制单列数据范围。首先,我需要弄清楚用户可能是在什么场景下需要这个功能。通常,限制数据范围是为了保证数据的准确性和一致性,比如在Excel里设置数据验证,或者在数据库中对某一列添加约束,或者在编程时处理数据输入。 用户可能是在处理电子表格,比如Excel或者Google Sheets,或者是使用数据库如MySQL、PostgreSQL,也有可能在编程中使用Python的Pandas库。不同的工具有不同的方法,所以我需要覆盖几种常见的情况,然后给出步骤说明。 首先,Excel的情况。用户可能想限制某一列只能输入特定范围的数值,比如年龄在0到120之间。这时候可以用数据验证功能。步骤大概是选中列,打开数据验证,设置允许的条件,输入最小值和最大值。或者提供下拉列表选择特定选项。 然后是数据库方面,比如在创建表的时候,给某一列添加CHECK约束,确保插入数据在指定范围内。例如,在创建表的时候加上CONSTRAINT约束,检查值是否在某个区间内。或者使用触发器,在插入或更新时检查数据是否合法。 如果是编程处理,比如用Python的Pandas,可以在读取数据后,用条件筛选或替换超出范围的值,或者用断言检查数据是否符合要求。也可能需要用到数据验证库,比如Pydantic,在数据进入时进行校验。 还需要考虑用户可能遇到的错误,比如在Excel中输入不符合条件的数据是否会弹出警告,或者在数据插入时违反约束导致报错,这时候需要提示用户如何处理这些错误。 另外,用户可能没有明确说明使用什么工具,所以需要询问清楚,或者给出不同工具的解决方案。不过根据问题描述,用户可能希望得到通用的方法,或者涵盖多种常见工具的操作步骤。 还要注意步骤的清晰度,用分点说明,让用户容易跟随操作。可能需要举例说明,比如限制年龄列在0到120之间,或者性别列只能输入“男”或“女”。 最后,确保回答结构清晰,先分场景,再详细说明每个场景下的具体步骤,这样用户可以根据自己的情况选择合适的方法。</think>限制单列数据范围是数据处理的常见需求,具体实现方式取决于使用的工具。以下是不同场景下的解决方案: 1️⃣ **Excel/Google Sheets** - 选中目标列 → 数据数据验证(Excel)或数据验证规则(Sheets) - 设置允许条件: - 整数/小数范围:设置最小值和最大值 - 列表范围:输入允许的值(如`男,女`) - 自定义公式:例如`=AND(A1>=0,A1<=100)` 2️⃣ **SQL数据库** ```sql -- 创建表时添加约束 CREATE TABLE users ( age INT CHECK (age BETWEEN 0 AND 120) ); -- 修改现有表 ALTER TABLE users ADD CONSTRAINT age_range CHECK (age >= 0 AND age <= 120); ``` 3️⃣ **Python Pandas** ```python # 筛选有效数据 df = df[(df['score'] >= 0) & (df['score'] <= 100)] # 替换越界值 df['age'] = df['age'].clip(lower=0, upper=150) # 断言验证 assert df['temperature'].between(-50, 100).all() ``` 4️⃣ **编程语言验证** ```javascript // 前端表单验证示例 <input type="number" min="1" max="100" required> // Node.js后端验证 if(value < 0 || value > 100) { throw new Error('数值超出允许范围'); } ``` ⚠️ 注意事项: - 数据库约束会影响插入/更新操作 - 前端验证需配合后端二次校验 - 对于已有越界数据,建议先清理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值