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

目录

背景

思考

数据表结构

索引

数据

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

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

执行情况​​​​​​​

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

执行情况

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

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

执行情况

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

执行结果

 缺点

总结


背景

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

思考

        其实是数据库的“存在则更新数据,不存在就插入数据”问题,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和改变除所需字段以外的值,有丢失数据的风险,建议熟悉该语法并对应业务场景才使用。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值