当前位置: 首页 > news >正文

SQL语句如何避免在mysql插入重复数据

目录

准备

insert ignore into

on duplicate key update

replace into

insert if not exists


如何避免在mysql插入重复数据?

最常见的做法,就是唯一索引或主键,不过,有时候不能只用唯一索引或者主键,毕竟真的重复了,会报错,如果处理不当,会有问题,因此,有一些特殊的语句就可以拿来用

准备

先进行表的准备工作,

CREATE TABLE `usermessage` (
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `password` varchar(255) DEFAULT NULL,
  `id` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `index_username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

insert ignore into

在插入数据时,如果数据存在,就忽略

前提条件要求插入的字段设置了主键或者唯一索引,插入数据时,DB会首先查找已有数据,如果存在,本次就不插入,不存在,就正常插入

我们先插入一条

INSERT INTO usermessage(`name`, `word`) VALUES ('ad', 'ad123');

然后我们试试再次插入此记录

看,影响行数0,我们再试试别的记录

on duplicate key update

插入数据时,如果存在,那就更新

前提也是要有主键或者唯一索引,插入数据时,DB会首先查找已有数据,如果存在,本次就更新,不存在,就正常插入

INSERT INTO usermessage(`name`, `word`) VALUES ('sysadmin', 'update_password') on duplicate key update word ='update_password';

这是表里的数据,我们执行以下SQL,再看结果

replace into

插入数据时,如果数据存在,那就删除再插入

前提也是要有主键或者唯一索引,如果存在,那就先删除,不存在,就直接插入

这是替换前的数据,我们执行以下SQL

replace into usermessage(name, word) values ('root', 'root_replace');

注意,id也变了,id我们设置的是自增的,所以是删除再插入的,不是修改

insert if not exists

如果不存在就插入

前面三种都有主键或者唯一索引的限制,这一种没有

insert into usermessage(`name`, word) select 'user1', 'reset' from DUAL where not exists (select `name` from usermessage where `name` = 'user1');

 具体使用那种,可以看情况

相关文章:

  • JsonSchema 转换为 Typescript
  • 【区块链 | OpenZeppelin】手把手交易使用OpenZeppelin Upgrades部署可升级智能合约
  • 同一公司开发的多个软件,可以用同一张代码签名证书吗?
  • 深度分析:用户最喜欢用哪种NFT做头像
  • php 小数计算 结果变无限小数解决方案
  • WebRTC研究:丢包与抖动
  • freeswitch的3XX重定向
  • jsp+sql毕业生招聘系统免费系统+论文
  • Java毕业设计-火车订票管理系统
  • SwiftUI 界面状态 成员变量 @State @Buiding immutable
  • Java 进阶集合和数据结构
  • RabbitMQ、RocketMQ、Kafka常见消息队列不得不知道的事
  • 简单工厂模式、工厂模式、抽象工厂模式(含C++代码)
  • 自动化测试之路 —— Appium输入及模拟手势
  • 使用聚类(K-means)分析方法对骑手进行分类标签定义
  • [数据结构]链表的实现在PHP中
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Cumulo 的 ClojureScript 模块已经成型
  • ECMAScript6(0):ES6简明参考手册
  • FineReport中如何实现自动滚屏效果
  • Java多线程(4):使用线程池执行定时任务
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python语法速览与机器学习开发环境搭建
  • React-flux杂记
  • Sass Day-01
  • session共享问题解决方案
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 爱情 北京女病人
  • 对超线程几个不同角度的解释
  • 汉诺塔算法
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简析gRPC client 连接管理
  • 爬虫模拟登陆 SegmentFault
  • 前端相关框架总和
  • 前言-如何学习区块链
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用common-codec进行md5加密
  • 网络应用优化——时延与带宽
  • 因为阿里,他们成了“杭漂”
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #1015 : KMP算法
  • #NOIP 2014# day.1 T2 联合权值
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (python)数据结构---字典
  • (附源码)php新闻发布平台 毕业设计 141646
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)RocketMQ初步认识
  • (转)ObjectiveC 深浅拷贝学习
  • (转)shell中括号的特殊用法 linux if多条件判断