因为一条sql语句产生了自我怀疑!

落杰小哥_1412

落杰小哥_1412

2022-12-30

2179人浏览

转载

 故事是这样开始的

在一个月黑风高的夜晚

现场报过来,本该打到新服务的流量,又走到了老服务,老服务的功能不健全,很可能会让现场的用户不能支付。 需要说明一点的是,任何一个从老服务改造到新服务的时候,都不是完全把流量切过去,都需要经过一点时间去验证。

比如我们按照地理位置去切,将北京的部分车场(是的,我们是做停车服务的),切到新服务,其他城市的车场在老服务

我们采用最简单的办法,就是靠一个字段type去控制(0和1)

看似简单,但是事怪就怪在这个字段上,这个控制字段是属于后来加到数据库字段的,而且没有对外去配置,都是通过运维手动去数据库配置的,且数据库字段默认值设置为1。

可总有几个车场时不时的从0就变成了1。。众所周知,一个新的字段不在mybatis xml和pojo出现,那么就不会有操作改掉

翻遍所有的服务,关乎这个表的都是update操作,update操作因为没有这个字段时打死也不会改这个type的

image.png

冷静下来想想,数据库默认字段为1,然后0都会变成1。没有1变成0的,可以肯定的是,先删除,又新增了,否则没有别的解释

经过一番查验,找到这样一堆代码(伪代码)

replace INTO `A` (
      park_id,
      xxxx,
      xxxx
    )
    SELECT
       park_id,
       xxxx,
       xxxx 
    FROM
    B 
    where b.park_id = #{parkId}复制代码

看到这里,心里嘿嘿一笑,破案了。。。。。

image.png

 replace INTO

是的,就是replace INTO搞得鬼,大家都知道,replace INTO和insert into的区别

1、replace into 首先尝试插入数据到表中, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。

2、如果表中无此数据,则插入新数据。

DrugBank 数据库
DrugBank 数据库

访问并分析来自 DrugBank 数据库的全面药物信息,包括药物属性、相互作用、靶点、通路、化学结构和药理学数据。用于药物数据、药物发现研究、药理学研究、药物-

下载

这就正好验证了上面的猜想,只有删除再添加,才会让type跟随数据库的默认值走

讲到这里不妨我们多了解一点这个,有人可能会问,replace是不是取代了insert和delete,毕竟是干了两件事

MySql手册关于replace into的算法:Mysql手册

MySQL uses the following algorithm for REPLACE (and LOAD DATA ... REPLACE):Try to insert the new row into the tableWhile the insertion fails because a duplicate-key error occurs for a primary key or unique index:Delete from the table the conflicting row that has the duplicate key valueTry again to insert the new row into the tableMySQL对REPLACE(和LOAD DATA…REPLACE)使用以下算法:

尝试将新行插入表中

当由于主键或唯一索引出现重复键错误而导致插入失败时:

从表中删除具有重复键值的冲突行

再次尝试将新行插入表中复制代码

先插入, 出错了再执行delete加insert. 如果自己用程序来做, 个人认为效率会低很多,另外这样写真的很搞人

这里推荐使用INSERT...ON DUPLICATE KEY UPDATE, 感觉很靠谱. replace的副作用:

  • replace每次要重新分配自增id;

  • replace中执行delete时, 在有外键的情况下会很麻烦;

  • 如果delete时定义的有触发器, 则会被执行;

  • 副作用也会被传播到replica slave

 总结

开发当中难免遇到奇奇怪怪的各种问题,有问题莫慌,冷静分析,你认为的不可能事件、你认为的计算机会发生错误,其实都是自己没有去完全理解到位,跟踪到位!!!【推荐学习:MySQL视频教程、SQL视频教程】

最后祝大家2023,少写bug,少加班,多涨薪

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql 数据库

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4723

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1249

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6721

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3463

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6720

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9281

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Docker Desktop设置与维护手册
Docker Desktop设置与维护手册

共0课时 | 0人学习

LLVM官方文档
LLVM官方文档

共0课时 | 0人学习