数据库字段唯一性修复指南:从设计缺陷到规范实现
数据库字段唯一性修复指南:从设计缺陷到规范实现
一、问题背景
表结构设计缺陷:
sys_user
表未对 dingtalk_user_id
(钉钉用户ID)字段设置唯一性约束,导致数据重复,引发以下问题:
- 系统稳定性风险:用户登录冲突、业务逻辑异常
- 数据一致性问题:KPI统计失真、关联数据紊乱
原始表结构:
CREATE TABLE `sys_user` (`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',`dingtalk_user_id` VARCHAR(255) COMMENT '钉钉用户ID(唯一约束)',`user_name` VARCHAR(33) COMMENT '用户名',`password` VARCHAR(33) COMMENT '密码',`dept_name` VARCHAR(100) COMMENT '部门名称',`email` VARCHAR(200) COMMENT '邮箱',`enable` INT DEFAULT 0 COMMENT '状态:0启用/1禁用',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB;
二、规范化改造方案
方案一:直接添加唯一约束(推荐)
适用场景:表结构无需重构,数据量较小或重复数据可快速清理。
1. 执行约束添加
ALTER TABLE sys_user
ADD CONSTRAINT uk_dingtalk_user_id UNIQUE (dingtalk_user_id);
- 作用:创建唯一索引,强制字段值唯一性。
- 约束命名规范:
uk_<字段名>
,便于索引管理与识别。
2. 前置条件:处理重复数据
步骤1:检测重复数据
SELECT dingtalk_user_id, COUNT(*) AS duplicate_count
FROM sys_user
GROUP BY dingtalk_user_id
HAVING duplicate_count > 1;
步骤2:清洗重复数据(示例:保留最新记录)
-- 删除非最新记录(基于自增主键id)
DELETE FROM sys_user
WHERE id NOT IN (SELECT max_id FROM (SELECT MAX(id) AS max_id FROM sys_user GROUP BY dingtalk_user_id HAVING COUNT(*) > 1) AS t
);
- 注意:操作前需备份数据,避免误删;若业务需保留特定记录,需调整分组条件(如按
create_time
排序)。
3. 约束特性说明
- NULL值处理:允许单个
NULL
值(不同数据库对多个NULL
的兼容性不同,MySQL视为合法非重复值)。 - 性能影响:插入/更新时需校验唯一性,开销与数据量正相关,建议配合索引优化。
方案二:通过临时表迁移数据(大数据量场景)
适用场景:数据量庞大、需避免锁表风险,或需同步优化表结构(如字符集、冗余字段)。
1. 创建带约束的新表
CREATE TABLE sys_user_new (`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',`dingtalk_user_id` VARCHAR(255) UNIQUE COMMENT '钉钉用户ID(唯一约束)',`user_name` VARCHAR(33) COMMENT '用户名',`password` VARCHAR(33) COMMENT '密码',`dept_name` VARCHAR(100) COMMENT '部门名称',`email` VARCHAR(200) COMMENT '邮箱',`enable` INT DEFAULT 0 COMMENT '状态:0启用/1禁用',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB;
2. 迁移去重数据(保留唯一记录)
INSERT INTO sys_user_new (dingtalk_user_id, user_name, password, dept_name, email, enable, create_time
)
SELECT dingtalk_user_id, MAX(user_name), -- 按业务逻辑保留字段值,示例取任意非唯一字段的聚合值MAX(password), MAX(dept_name), MAX(email), MAX(enable), MAX(create_time) -- 推荐保留最新记录
FROM sys_user
GROUP BY dingtalk_user_id;
3. 切换表(需停机维护)
RENAME TABLE sys_user TO sys_user_old, sys_user_new TO sys_user;
- 优势:避免锁表影响业务;支持批量优化表结构(如添加复合索引、调整字段类型)。
三、约束生效验证与数据监控
1. 唯一性约束验证
(1)索引有效性检查
SHOW INDEX FROM sys_user;
-- 预期结果:存在名为 `uk_dingtalk_user_id` 的索引,`Non_unique` 列为 `0`(唯一索引)
(2)插入冲突测试
-- 首次插入成功
INSERT INTO sys_user (dingtalk_user_id) VALUES ('test_001');
-- 重复插入报错(MySQL示例)
-- ERROR 1062 (23000): Duplicate entry 'test_001' for key 'uk_dingtalk_user_id'
2. 数据一致性监控
(1)定时检测重复数据(建议加入定时任务)
SELECT dingtalk_user_id, COUNT(*) AS duplicate_count
FROM sys_user
GROUP BY dingtalk_user_id
HAVING duplicate_count > 1;
(2)业务层联动校验
- 在应用代码中添加唯一性校验逻辑(如插入前查询是否存在),降低数据库层报错概率。
四、扩展设计与最佳实践
1. 约束设计原则
特性 | 唯一约束(UNIQUE) | 主键(PRIMARY KEY) |
---|---|---|
NULL值支持 | 允许单个NULL | 不允许NULL |
数量限制 | 多个 | 仅一个 |
自动索引 | 是(唯一索引) | 是(聚簇索引) |
2. 复合唯一性约束
若需联合字段确保唯一性(如 dingtalk_user_id
+ dept_id
),可定义:
ALTER TABLE sys_user
ADD CONSTRAINT uk_dingtalk_dept UNIQUE (dingtalk_user_id, dept_id);
3. 性能优化建议
- 索引覆盖:为高频查询字段添加联合索引,避免回表查询。
- 批量操作:插入/更新时减少单次操作数据量,降低唯一性校验耗时。
- 慢查询监控:通过
SHOW STATUS LIKE 'Handler_duplicate_key'
统计重复键冲突次数,定位异常操作。
五、总结
通过添加唯一约束或数据迁移方案,可有效解决字段重复问题,保障数据一致性。实施前需根据数据量、业务影响范围选择合适方案,优先处理历史重复数据,并通过索引验证与持续监控确保约束生效。规范化表设计应在初期明确唯一性规则,减少后期维护成本。
相关文章:
数据库字段唯一性修复指南:从设计缺陷到规范实现
数据库字段唯一性修复指南:从设计缺陷到规范实现 一、问题背景 表结构设计缺陷: sys_user 表未对 dingtalk_user_id(钉钉用户ID)字段设置唯一性约束,导致数据重复,引发以下问题: 系统稳定性风…...

DataX从Mysql导数据到Hive分区表案例
0、下载DataX并解压到对应目录 DataX安装包,开箱即用,无需配置。 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 相关参考文档 https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md 1、Hive分区…...
高性能编程相关
常见高性能编程技巧: 一,系统级性能优化:从系统架构设计考虑,例如消息队列,模块分成分级,IO读写带宽等 二,算法级性能优化:时间和空间优化 三,代码级性能优…...

vulnhub靶场——secarmy
靶机:secarmy靶机,IP地址为192.168.230.18 攻击:kali,IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机,都采用NAT模式 端口扫描: nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…...

labview硬件采集
(1)硬件的描述 (2)实验步骤1: (3)实验步骤2 库名/路径的选择要使用32位的开发资料 (4)实验步骤3 (5)实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…...

openfeign与dubbo调用下载excel实践
一、前言 openfeign和dubbo均是rpc框架 RPC(Remote Procedure Call,远程过程调用)框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性,让开发者可以专注于业务逻辑,实现…...

ISP有感自发
一、黑电平 由于传感器,即便在无光的情况下,依然会产生微小的暗电流,这些暗电流可能是噪点会影响后期的调试。因此,我们便将这些电流处理为0,成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平: …...

web 自动化之 PO 设计模式详解
文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

NVMe简介1
它分为两部分,这里是第一部分。 NVM Express(NVMe)是一种高性能、可扩展的接口协议,用于通过PCI express(PCIe)总线,实现主机软件与NVM设备之间的通信。目前,由于NVMe SSD相比于SATA…...

【python机器学习】Day 25 异常处理
知识点: 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深对代码和流程的理解。 借助ai写代码的时候&…...

数学建模初等模型应用
一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想(设计思路、主要代码分析) 1、预测鱼的质量 (1)设计思路:使用线性回归模型预测鱼的质量…...
占位符读取标准输入缓冲区规则
1、如果标准输入缓冲区中的前若干个字符都是空白字符,%s,%d,%f都能直接跳过并且从第一个非空白字符开始读取,但%c不能,而是直接读取。 2、%s遇到空白字符时停止,不会读取遇到的空白字符。 3、%d遇到非数字…...

【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
原文地址:https://developer.aliyun.com/article/1662946 在当今快速发展的AI技术背景下,如何高效地集成模型能力成为开发者关注的重点。本文将手把手教你如何基于 Spring AI 搭建支持 SSE(Server-Sent Events)模式的 MCP 服务 相…...
【kafka】kafka概念,使用技巧go示例
1. Kafka基础概念 1.1 什么是Kafka? Kafka是一个分布式流处理平台,用于构建实时数据管道和流式应用。核心特点: 高吞吐量:每秒可处理百万级消息持久化存储:消息按Topic分区存储在磁盘分布式架构:支持水平…...

利用散点图探索宇航员特征与太空任务之间的关系
利用散点图探索宇航员特征与太空任务之间的关系 import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom flexitext import flexitext from matplotlib.patches import FancyArrowPatchplt.rcParams.update({"font.family": "Corbel&quo…...
Ubuntu 命令行显示中文输出信息
Ctrl Alt T 打开终端命令行, 输入命令: sudo apt-get install language-pack-zh-hans安装中文语言支持包 sudo apt-get install language-pack-zh-hans-base配置环境变量 sudo vim /etc/profile进入文件后,按下 a 进入编辑模式,shift ↓ \downarr…...
Linux文件编程——read函数与lseek函数
一、read函数 在 Linux 文件编程中,read 函数是一个系统调用,用于从文件描述符(File Descriptor)指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...
[思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?
一、什么是事物的关系? 事物的关系是指不同事物之间存在的各种联系和相互作用,它反映了事物之间的相互依存、相互影响、相互制约等特性。以下从不同维度为你详细阐述: 1、关系的类型 因果关系 定义:一个事件(原因&a…...
【2025.5.12】视觉语言模型 (更好、更快、更强)
【2025.5.12】Vision Language Models (Better, Faster, Stronger): https://huggingface.co/blog/vlms-2025 【2024.4.11】Vision Language Models Explained【先了解视觉语言模型是什么】: https://huggingface.co/blog/vlms nanoVLM: https://github.…...
Spring的bean的生命周期?
Spring中bean的生命周期包括以下步骤: 通过BeanDefinition获取bean的定义信息。 调用构造函数实例化bean。 进行bean的依赖注入,例如通过setter方法或Autowired注解。 处理实现了Aware接口的bean。 执行BeanPostProcessor的前置处理器。 调用初始化…...

Qwen集成clickhouse实现RAG
一、RAG概要 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索技术与语言生成模型的人工智能技术。旨在通过检索相关文档来增强大模型的生成能力,从而提高预测的质量和准确性。RAG模型在生成文本或回答…...

Excel分组计算求和的两种实现方案
文章目录 背景样例数据方案一、函数求和实现步骤缺点 方案二、数据透视表实现步骤优点 背景 在Excel文档中,经常会进行数据的求和计算,可使用不同的方式实现,记录下来,方便备查。 样例数据 已有商品销量信息,包含销…...
深入理解卷积神经网络:从基础原理到实战应用
在人工智能领域,卷积神经网络(Convolutional Neural Network,简称 CNN)凭借其强大的图像识别、处理能力,成为深度学习中不可或缺的技术。无论是自动驾驶汽车识别道路标志,还是医学影像分析辅助疾病诊断&…...

LLM定制新路径:微调与上下文学习的博弈与融合
在当今人工智能的浪潮中,大型语言模型(LLMs)已成为推动行业进步的关键力量。无论是自然语言处理、文本生成还是多模态应用,LLMs都在展现着它们的强大能力。然而,当我们将这些强大的模型应用于特定的下游任务时…...
【江苏省】《信息技术应用创新软件适配改造成本评估规范》(DB32/T 4935-2024)-标准解读系列
在信息技术应用创新产业蓬勃发展的当下,软件适配改造成本评估成为项目实施的关键环节。《DB32/T 4935-2024 信息技术应用创新软件适配改造成本评估规范》应运而生,为成本评估提供了专业依据。同时,《省级政务信息化项目建设方案编制规范&…...
JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践
JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践 Java开发与运维过程中,JDK自带的命令行工具是定位问题、性能调优、编译调试的基石。本文全面梳理JDK常用命令工具、帮助文档的获取方式,并总结类似Linux命令行的学习方法,助你系…...

嵌入式中深入理解C语言中的指针:类型、区别及应用
在嵌入式开发中,C语言是一种基础且极为重要的编程语言,其中指针作为一个非常强大且灵活的工具,广泛应用于内存管理、动态数据结构的实现以及函数参数的传递等方面。然而,尽管指针的使用极为常见,很多开发者在掌握其基本使用后,往往对指针的深入理解还不够。本文将深入分析…...

香港维尔利健康科技集团成都区域运营中心投入使用,西南市场战略全面提速
近日,香港维尔利健康科技集团正式宣布,其位于四川成都的西南区域运营中心已全面建成并投入使用。该中心将集设备调配、技术支持、客户服务、运营管理及数字健康平台维护于一体,成为集团在中国内地智慧医疗战略版图中的关键枢纽,对…...

STM32CubeMX HAL库 串口的使用
1.配置 2.开启中断后,生成代码 3.串口的接收 1).开启空闲中断接收 __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 关键步骤:启用空闲中断 2). 启动接收 调用 HAL_UARTEx_ReceiveToIdle_IT 启动异步接收,可以使用…...
二手车估值接口介绍
二手车估值接口是基于大数据和机器学习技术开发的工具,旨在为二手车交易、金融评估等场景提供快速、精准的车辆价值评估服务。以下从核心功能、技术原理、接口特点及应用场景等方面进行综合介绍: 一、核心功能 多维度数据采集与分析 接口整合了车辆基础…...