避免Mysql插入重复数据的几种方法

news2025/2/23 13:35:27

在这里插入图片描述

1、前言

在平时对数据库操作时,有时候需要向数据库中插入一些数据,此时就需要使用数据库的插入语句,但是在向数据中库插入数据时,不能盲目插入,因为盲目的插入可能会造成数据重复,浪费数据库的资源,所以一般情况下数据库中都会有所谓的主键,要求被选用的主键字段或者组合不能重复,这样可以避免一些脏数据的产生,但是同时又带来了一些不友好的操作,比如当在插入某条数据时,主键字段的值已经存在了,此时如果直接使用insert into语句进行插入时,则会报错,提示该字段的值已经存在,但是有时候我们并不希望看到语句报错,所以这就带来了一些不好的操作体验,为了避免这种报错的产生,最好的方式就是在插入的时候避免主键重复。如果实在避免不了。使用如下几种语法,同样可以达到不报错的效果。

语法备注(存在主键)
insert ignore into若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert into not exists若在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
insert into on duplicate key update若在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。
replace into若在数据库已经存在,则直接删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

2、案例

测试数据库

-- auto-generated definition
create table if not exists  t_admin
(
    id        int auto_increment
        primary key,
    adminName varchar(50) null,
    passWord  varchar(50) null
);
INSERT INTO t_admin (id, adminName, passWord) VALUES (1, 'admin', 'admin');
INSERT INTO t_admin (id, adminName, passWord) VALUES (2, 'xiaoqian', '123456');

2.1 、insert ignore into

解释:

​ 存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

insert ignore into t_admin value (2,'itbestboy','123456');

在这里插入图片描述

可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度,如果按着平时的操作是肯定会报错的。

报错

在这里插入图片描述

2.2、 insert into not exists

解释:

存在主键, 若插入的数据主键值在数据库已经存在,则不执行此次操作。若在数据库中不存在,则将此次数据插入数据库中。

insert into t_admin select 2,'itbestboy','123456' from t_admin where not exists(select id from t_admin where id=2);

在这里插入图片描述

可以看出,此时插入没有成功,因为主键值已经存在,忽略了此次插入操作,但是也没有报错,提高了友好度.

2.3、insert into on duplicate key update

解释:

存在主键, 若插入的数据主键值在数据库已经存在,则先更新,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。

-- 主键值在数据库中已经存在,此时会先执行update 语句,然后在插入,
insert  into t_admin value (2,'itbestboy','123456') on duplicate key update adminName='itbestboy', passWord='123456';
-- 注;当update语句后跟的值与value中的值不一致时,会按着update语句后的值进行入库操作。

在这里插入图片描述

若主键值在数据库中不存在,则会直接插入,update语句失效

 insert  into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';

在这里插入图片描述

2.4、replace into

存在主键, 若插入的数据主键值在数据库已经存在,则先删除,然后执行此次操作。若在数据库中不存在,则将此次数据插入数据库中,此操作类似更新语句。

-- 主键值在数据库中已经存在,此时会先删除这条记录,然后重新插入数据库中
replace into t_admin (id, adminName, passWord) VALUES (3, 'boy', '123456');

在这里插入图片描述
在这里插入图片描述

若主键值在数据库中不存在,则会直接插入,删除语句失效

 insert  into t_admin value (3,'itbestboy','123456') on duplicate key update adminName='tboy', passWord='1456';

在这里插入图片描述
在这里插入图片描述

3、总结

虽然上述方法可以避免主键值重复时插入报错,但是有时候,我们就需要看到相应的报错信息,才会更加有利于调试,所以至于怎么使用何时使用需要视情况而定。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytest三种配置文件

😎😎原文出自:测个der,博主的公众号,格式美观一些。 配置介绍 pytest 的主配置文件,可以改变 pytest 的默认行为,执行 pytest -h,这里有很多配置均可用于 pytest.ini配置 (venv) …

HarmonyOS鸿蒙学习笔记(16)Canvas入门使用

Canvas入门指南1、Canvas代码结构2、简单案例2.1 fillStyle和fillRect 绘制蓝色矩形2.2 strokeRect和strokeStyle 绘制红色边框2.3 lineCap的使用2.4 lineJoin的使用2.5 closePath的使用3、参考资料1、Canvas代码结构 在使用Canvas的时候,需要向初始化RenderingCon…

第四十七讲:IPv6基础知识

一、IPv6网络元素及概念 IPv6的网络元素如下图所示。 节点:任何运行IPv6的设备,包括路由器和主机(甚至还将包括PDA、冰箱、电视等)。邻节点:连接到同一链路上的节点。这是一个非常重要的概念,因为IPv6的邻…

JS面试题--this指向+面试题

this其他补充 内置函数的绑定思考 01_一些函数的this分析 // 1.setTimeout原理 // function hySetTimeout(fn, duration) { // fn.call(window) // }// hySetTimeout(function() { // console.log(this) // window // }, 3000)// setTimeout(function() { // console.l…

EEG论文阅读和分析:《Differential entropy feature for EEG-based emotion classification》

论文阅读《Differential entropy feature for EEG-based emotion classification》 论文的核心是提出差分熵作为特征,并且对差分差分熵和比例差分熵等特征进行对比研究。 算法流程步骤: 采样过程: A.预处理 根据受试者的压力反应&#xf…

零基础转行软件测试可行吗?

如今,随着人们对软件质量的要求越来越高,软件测试已经成为最热门的IT行业之一。不少非科班出身的转业者也纷纷开始观望这个行业,因此不少人会问,零基础转行软件测试有前途吗?答案显而易见,如果你想成为最炙…

【C语言】数据类型(基本类型、构造类型、类型转换)

⏰打卡:DAY1 🏆今日学习目标:数据类型(基本类型、构造类型、类型转换) ✨个人主页:颜颜yan_的个人主页 🎉专栏系列:从0开始学C语言 文章目录前言基本类型整型浮点型字符型构造类型数…

Mybatis学习——增删改(mysql8.0)

目录 一、配置文件 (一)添加mybatis依赖: (二)resources资源目录的配置 1.database.properties文件的设置 2.mybatis-config.xml文件的设置 二、引入原始类 三、DogDao接口,定义增删改功能 (一)单条数据增删改 1.新增 2.删除 3.修改 (二)多条…

Makefile详细教程

Makefile详细教程 我编写本指南是因为我永远无法完全理解 Makefile。 他们似乎充斥着隐藏的规则和深奥的符号,提出简单的问题并没有得到简单的答案。 为了解决这个问题,我花了几个周末的时间坐下来阅读所有关于 Makefile 的内容。 我已将最关键的知识浓…

【链表】leetcode206.反转链表(C/C++/Java/Js)

leetcode206.反转链表1 题目2 思路2.1 双指针法(迭代)2.2 递归法2.2.1 递归--从前往后翻转指针指向2.2.2 递归--从后往前翻转指针指向3 代码3.1 C版本(迭代)3.2 C版本(迭代递归)3.3 Java版本(迭…

【OpenDDS开发指南V3.20】第十章:Java Bindings

介绍 OpenDDS提供JNI绑定。Java应用程序可以像C++应用程序一样使用完整的OpenDDS中间件。 有关入门的信息,包括先决条件和依赖项,请参阅$DDS_ROOT/java/INSTALL文件。 Java版本9和更高版本使用Java平台模块系统。要在这些Java版本中使用OpenDDS,请将MPC特性Java_pre_jpms…

QT Echarts 联动共享数据表图 使用详解

Echarts是百度的一款可视化界面开发的平台,里面的地图以及数据可视化内容十分丰富,适合用于一些大屏数据显示项目或者一些ui界面开发。每一个ECharts图表使用一个无边框的QWebView来展示,这样多个不同类型的ECharts图表就是多个封装不同类型E…

kettle 筛选数据 并根据关键字段去重 设计

文章目录前言kettle 筛选数据 并根据关键字段去重 设计实现:1、配置sqlite 数据库链接2、先从test表里抽取数据3、将表输入查询的数据插入到excel里4、将筛选出来的数据根据id去重5、插入本地excel6、ETL 整体效果:7、测试:前言 如果您觉得有用的话,记得给博主点个赞…

安全轻量化股票看盘盯盘软件需要实现的功能和基本要求是什么?

有很多投资者是上班族的,因此是不能无时无刻盯盘看盘的,那么为了解决这个问题就需要用上轻量化股票看盘盯盘软件,那么一个安全的轻量化股票看盘盯盘软件需要具备哪些功能和基本要求呢?接下来小编为大家分析分析! 1.一定…

小试跨平台局域网文件传输工具NitroShare,几点感想

随着电脑系统国产化的推进,单位用的OA系统已转移到国产电脑上了,但是国产电脑上的操作系统基于Linux,软件商店里可选的应用软件还不够多,功能也还有待提高。为了提高处理效率,经常需要把文件从国产电脑传到Windows平台…

信息收集过程WAF绕过详解

今天继续给大家介绍渗透测试相关知识,本文主要内容是信息收集过程WAF绕过详解。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

浅析数据中心机架配电母线的应用及监控

摘要:本文先分析配电母线槽创新点和优势,然后结合湛江数据中心302机房母线槽建设对配电母线槽和列头柜两种供电方式进行经济效益对比,最后总结推广应用建议,以期为相关工程技术人员提供参考。 关键词:机架配电母线&a…

【动态路由和导航守卫】一.动态路由;二.路由中的查询参数;三.命名路由;四.命名视图;五.声明式导航 编程式导航;六.导航守卫

目录 一.动态路由 1.什么是动态路由? 2.动态路由如何进行参数的传递: (1)如何设置URL地址中的参数:/url/:参数名 (2)在组件中接收参数:this.$route.params.参数名 3.$route和$r…

最新版android-studio无法安装Lombok插件?魔改后可任意安装版本教程(附已魔改下载地址)

🤵‍♂️ 个人主页: 奇怪的守护神 👨‍💻 作者简介:十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️! 🗺️学海无涯苦作舟,🛤️…

【自学Python】Python字符串(string)

Python字符串(string) Python字符串(string)教程 字符串是一个不可改变的字节序列。字符串可以包含任意的数据,但是通常是用来包含可读的文本。 Python字符串(string) Python 字符串定义有五种形式,使用单引号、双引号、三个单引号 、三个双引号以及…