MySQL的数据插入总结(不存在就插入,存在就更新)

MySQL的数据插入总结(不存在就插入,存在就更新)

1. on duplicate key update

当在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键 中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

sql命令示例:

表名:test123,字段名:id, name, phone

.


.

情况1

初始表,name设定为唯一索引,表中存在2条数据:

执行sql:

sql 复制代码
INSERT INTO `test123` (`id`,`name`,`phone`) 
VALUES (1,'牛马11','13333026523'), 
(3,'牛马11','144444026524')
ON DUPLICATE KEY UPDATE `name` = "牛马22";

执行结果:

结论: 将数据库中已存在的第一条name重复的值修改为 "牛马22",然后第三条正常插入;

.


.

情况2

初始表,name设定为唯一索引,表中存在1条数据:

执行sql:

sql 复制代码
INSERT INTO `test123` (`id`,`name`,`phone`) 
VALUES (1,'牛马11','13333026523'), 
(3,'牛马11','144444026524')
ON DUPLICATE KEY UPDATE `name` = "牛马22";

执行结果:

结论:sql命令中如果有唯一索引重复的数据,那么最终只会插入一条,并且 name = "牛马22"

.


.

总结 on duplicate key update:

  • 数据表id是自动递增的不建议使用该语句;如果冲突数据比较多,新增的下一条id会相应跳跃的比较大。

  • 有并发事务执行的insert 语句情况下不建议使用该语句,可能会导致产生死锁

============================================================================================

2. insert ignore into

当插入数据时,如果数据存在,则忽略冲突的这行数据插入,其他插入正常执行;前提条件是插入的数据字段设置了主键或唯一索引

sql命令示例:

表名:test123,字段名:id,name,phone

sql 复制代码
INSERT IGNORE INTO `test123` (`id`,`name`,`phone`) 
VALUES (1,'牛马','13333026523'), (2,'尼玛','12222026522');

============================================================================================

3. replace into

replace into 跟 insert into功能类似,不同点在于:replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据。

注意,插入数据的表必须有主键或者是唯一索引!否则replace into 会直接插入数据,这将导致表中出现重复的数据。

replace into 的sql命令:

sql 复制代码
1. replace into table_name(col_name, ...) values(...);

第1种形式类似于insert into的用法;


sql 复制代码
2. replace into table_name(col_name, ...) select ...;

第2种 replace select 的用法也类似于insert select,这种用法并不一定要求列名匹配,它需要的是列的位置。

例如,replace into table1( id, name, phone) select num, remark, phone_num from table2;

这个例子使用replace into从表table2中将所有数据导入到表table1中。


sql 复制代码
3. replace into table_name set col_name=value, ...;

第3种replace set用法类似于update set用法,使用一个例如"SET col_name = col_name + 1"的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

============================================================================================

4. insert if not exists

即insert into ... select ... where not exist ... ,这种方式适合于插入的数据字段没有设置主键或唯一索引,当插入一条数据时,首先判断MySQL数据库中是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略。

sql语法示例:

sql 复制代码
INSERT INTO TABLE (field1, field2, fieldn) 
SELECT
'field1',
'field2',
'fieldn'
FROM DUAL
WHERE NOT EXISTS (
    SELECT field 
    FROM TABLE
    WHERE field = ?
  )

详细可参考:insert if not exists 插入示例

相关推荐
梦想平凡37 分钟前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
凤山老林1 小时前
Spring Boot 整合 Flowable 的企业级落地指南
数据库·spring boot·后端·flowable·工作流
企业数字化笔记1 小时前
AI写的系统出现504怎么办?接口超时和数据库慢查询排查
数据库·后端
2601_962218612 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
Wang's Blog2 小时前
Java框架快速入门:Spring Security+OAuth2之用户注册与唯一性校验实现
java·数据库·spring
跨境生态圈2 小时前
2026谷歌SEO快速排名深度解析:合规起量、避坑指南与实战落地策略
数据库·人工智能·爬虫·搜索引擎·chatgpt
JavaPub-rodert3 小时前
Docker 安装 MySQL 完整教程:从零部署数据库,到生产环境持久化配置
数据库·mysql·docker
隔窗听雨眠3 小时前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
xhbh6663 小时前
中小企业 Redis 运维,如何安全归档 RDB、AOF 备份文件?
运维·数据库·缓存·数据备份·文件备份·同步备份·号码备份
2301_32241428043 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具