您现在的位置是:首页 > 正文

dml中的and使用误区

2024-04-01 01:13:56阅读 1

下午刚刚在一个jira变更中的遇到问题,非常容易产生误使用,产生比较大的危害。大家看下。非常简单的一条SQL:

mysql> update order_original set audit_status=3 and is_queue=1 where id=16682331;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0


很快就执行完了。但是,大家留意到没? Changed: 0 ,即虽然Rows matched: 1,确实有 id=16682331这一行,但是没有更新成功。这时,很多人肯定想到,这里肯定就是已经被更新过了啊。我们来看下:

mysql> select audit_status,is_queue from order_original where id=16682331;
+--------------+----------+
| audit_status | is_queue |
+--------------+----------+
| 1 | 1 |
+--------------+----------+
1 row in set (0.00 sec)


是不是很奇怪,并不是我们想要的结果。OK,我们把SQL改变一下写法:

mysql> update order_original set audit_status=3, is_queue=1 where id=16682331;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0


注意,是不是已经是Changed: 1 ?我们实例再查一下:

mysql> select audit_status,is_queue from order_original where id=16682331;
+--------------+----------+
| audit_status | is_queue |
+--------------+----------+
| 3 | 1 |
+--------------+----------+
1 row in set (0.00 sec)


确实数据update成功了。到这里大家应该明白了吧。如果还不明白,我们再做一个更明显的实验,帮忙看清本质的原因:

mysql> create table test(a int,b int,c int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values(1,2,3);
Query OK, 1 row affected (0.00 sec)

mysql> update test set b=99 and c=3 where a=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from test;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 1 | 3 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update test set b=99 and c=5 where a=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from test;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 0 | 3 |
+------+------+------+
1 row in set (0.01 sec)


即在update中,set 列=值,这个等号后面把and看成一个位运算,当后面的结果存在或正确时(set b=99 and c=3),那就是set 列=1,错误或不存在时(set b=99 and c=5)就是0。

因此,这个SQL的写法的危害是极大的,如果一个SQL执行报错,那APP报错,我们会去查找它的原因。

但如果它是一个错误的SQL,却被执行成功了,返回APP执行成功,那我们就感知不到它。而它一定会导致更新成一个完全错误的值,使我们的数据产生极大的破坏。

幸好这次只是在jira只执行了一次,但如果这样的SQL上线后被APP反复执行,将会给我们的线上数据产生不可估量的破坏。


因此必须避免在update的列更新中使用and。切记。

网站文章

  • Request通用方式获取请求参数

    Request通用方式获取请求参数

    java

    2024-04-01 01:13:29
  • SpringMVC与Struts2的主要区别

    区别1:Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilter SpringMvc的核心是基于一个Servlet即DispatcherServlet(前端控制器)区别2:Struts2是基于类开发的,传递的参数是通过类的属性传递(属性驱动和模型驱动),所以只能设计成多例prototypeSpringMvc是基于类中的方法开发的,也就是一个url对应

    2024-04-01 01:13:23
  • ffmpeg 音频解码一

    ffmpeg 音频解码一

    前言 前面已经介绍了音频的解码流程,这篇开始就开始视频解码了,同样是两篇,一篇使用parser解析器做解析,一篇按常规流程处理。 一些基础知识 采样率(sample_rate): 即取样频率, 指每秒...

    2024-04-01 01:13:18
  • JNI获取并修改Java中类的变量和静态变量的值

    对于JNI的基本使用请移步:Hello JNI本文主要介绍以下几个函数的使用:GetObjectClassGetFieldID,GetStaticFieldIDGet< Type>Fiel...

    2024-04-01 01:12:52
  • 基于单片机的智能宠物监控设计

    基于单片机的智能宠物监控设计

    在本节中宠物管理系统的硬件电路主要包含:供电电路,微处理器最小系统,存储电路,光敏传感器电路,TTL-UART转USB电路,SWD调试及外扩电路接口,按键电路等。此工程项目的开发过程中,熟悉了工程开发...

    2024-04-01 01:12:44
  • ArcGIS批量导出图片

    ArcGIS批量导出图片

    我们在涉及到大量图斑数据或者底图要素需要出图时,就需要借助ArcGIS中的批量出图功能,这样能够减少很多的人力时间。下面是批量导出图斑数据的步骤。所需数据:a.要素数据(矢量的点线面要素数据)b.影像...

    2024-04-01 01:12:36
  • 拼多多的前端面经

    1.说一下vue router的原理 我说了history和hash的原理onhashchange我都说了 原理层说的 他说不对 我整个前后端路由都解释了 他说不对 他问我怎么实现的不刷新 我不知道。2.js、css加载阻塞问题 如果css加载时间长会阻塞后面的渲染吗3.两种图片引用方式? background-image 和 img的区别? 哪个先加载?4.响应式原理...

    2024-04-01 01:12:05
  • 使用MySQL Shell搭建MGR环境

    使用MySQL Shell搭建MGR环境

    更多文章,欢迎关注作者公众号,欢迎一起交流。1)部署 SandBox 环境[root@serverc local]# mysqlshMySQL Shell 8.0.28-commercialCopyr...

    2024-04-01 01:12:01
  • 2022.07.30 Linux矩阵按键驱动笔记1

    这是之前帮客户开发矩阵键盘驱动时记录的笔记。 1. 行GPIO必须为输入,列GPIO必须为输出。 2. 硬件原理图上的引脚与DTS文件中的引脚必须匹配。 3. X30.dts中要配置行,列对应的键值,...

    2024-04-01 01:11:52
  • delphi 判断结构体不为空_数据结构(3)——堆栈的顺序存储实现

    delphi 判断结构体不为空_数据结构(3)——堆栈的顺序存储实现

    堆栈(Stack):顺序存储运算数,需要时倒序输出具有一定操作约束的线性表,只在栈顶做插入删除。插入:入栈删除:出栈后入先出:Last In First Out(LIFO)栈的顺序存储结构通常由一个一...

    2024-04-01 01:11:21