MySQL之存在则更新,否则就插入数据

 更新时间:2024年01月31日 16:04:03   作者:ChengQinHong  
这篇文章主要介绍了MySQL之存在则更新,否则就插入数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

用户获得免费电影观看权,如果同个电影获得再次获得观看权,则在领取记录中更新获取时间,如果首次获取的免费电影观看权,则新增一条获奖记录。

思考

其实是数据库的“存在则更新数据,不存在就插入数据”问题,MySQL有相应的语法可以解决,需要搭配索引。

数据表结构

CREATE TABLE `prize_order` (
  `id` int NOT NULL AUTO_INCREMENT,
  `mobile` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手机号码',
  `order_status` int DEFAULT '0' COMMENT '受理状态,1-成功,0-失败',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `prize_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '奖品电影编号',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `index_uni` (`mobile`,`prize_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单日志表';

索引

数据

第一种insert语法(推荐!!!)

语法(此时不知道表中已有prize_id='1'的数据)

insert into prize_order (mobile,create_time,prize_id) values('15122223333','2022-10-02 00:00:00','1') on DUPLICATE key update create_time =now()

不知道表中数据的情况下,已有数据会更新,mobile='15122223333' and prize_id='1'数据会修改create_time字段=now() 

执行情况

语法(此时不知道表中无prize_id='60'的数据)

insert into prize_order (mobile,create_time,prize_id) values('15122223333',now(),'60') on DUPLICATE key update create_time = now()

不知道表中数据的情况下, 当数据不存在时,则会新增一条mobile='15122223333' ,prize_id='1',create_time字段=now() 的数据 

执行情况

第二种replace语法(个别场景下使用)

语法(此时不知道表中已有prize_id='1'的数据)

replace into prize_order(mobile,order_status,create_time,prize_id)VALUES('15122223333','1',now(),'1')

执行情况

​​​​​​​

 

语法(此时不知道表中无prize_id='20'的数据)

replace into prize_order(mobile,order_status,create_time,prize_id)VALUES('15122223333','1',now(),'20')

执行结果

 缺点

相信replace语法对很多“存在则更新,否则插入数据”的需求都满足。

我们也看到了,它会删除原数据,再进行插入数据,此时你有些字段不想更新,则被它抹除了,所以,用这个语法记得把所有需要的字段都正确赋值,不然会出现丢失数据的后果。

总结

根据以上对比,insert语法更优,推荐使用,因为不影响原有id,也只会更新所需字段,其余不处理的字段保持原有值;而replace语法则会改变id和改变除所需字段以外的值,有丢失数据的风险,建议熟悉该语法并对应业务场景才使用。

好了,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 分享8个不得不说的MySQL陷阱

    分享8个不得不说的MySQL陷阱

    这篇文章给大家分享8个不得不说的MySQL陷阱,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • mysql实现自增序列的示例代码

    mysql实现自增序列的示例代码

    这篇文章主要介绍了mysql实现自增序列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mysql 5.7.17 winx64安装配置方法图文教程

    mysql 5.7.17 winx64安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.17winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MySQL 时区与 serverTimezone详解

    MySQL 时区与 serverTimezone详解

    存储 TIMESTAMP 类型数据时,MySQL 会根据当前会话的时区将时间转换为 UTC 时间,MySQL 实际存储的是 UTC 时间,这篇文章主要介绍了MySQL 时区与 serverTimezone,需要的朋友可以参考下
    2024-12-12
  • mysql中文显示为问号?的问题及解决

    mysql中文显示为问号?的问题及解决

    这篇文章主要介绍了mysql中文显示为问号?的问题及解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL5.6下windows msi安装详细介绍

    MySQL5.6下windows msi安装详细介绍

    这篇文章主要介绍了MySQL5.6下windows msi安装详细介绍,介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • 详解MySQL如何选择合适的索引

    详解MySQL如何选择合适的索引

    选择合适的索引是数据库优化中非常重要的一步,正确的索引可以大幅提高查询性能,减少数据库响应时间;而不当的索引选择则可能增加存储开销,影响数据库性能,甚至使得某些操作变得更加缓慢,以下是选择合适索引的一些指导原则和策略,需要的朋友可以参考下
    2024-12-12
  • 从MySQL 5.5迁移到Mariadb 10.1.14所遇到的问题

    从MySQL 5.5迁移到Mariadb 10.1.14所遇到的问题

    这篇文章主要介绍了从MySQL 5.5迁移到Mariadb 10.1.14所遇到的问题的相关资料,需要的朋友可以参考下
    2016-08-08
  • 使用JDBC在MySQL数据库中如何快速批量插入数据

    使用JDBC在MySQL数据库中如何快速批量插入数据

    这篇文章主要介绍了使用JDBC在MySQL数据库中如何快速批量插入数据,可以有效的解决一次插入大数据的方法,
    2016-11-11
  • MySQL数据备份、还原、数据库迁移以及表的导出和导入

    MySQL数据备份、还原、数据库迁移以及表的导出和导入

    作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的,下面这篇文章主要给大家介绍了关于MySQL数据备份、还原、数据库迁移以及表的导出和导入的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论