首页
学习
活动
专区
圈层
工具
发布

MySQL NOT IN为什么查不出数据?NULL值陷阱与三种改法

子查询里只要有一行NULL,整个NOTIN就废了。这一点和IN不一样,IN碰到NULL一般不会改变非空值的匹配结果。如果左边这一列本身也可能是NULL,情况一样。...业务想要幂等,唯一键就别留可空列。...业务上不允许空的列,建表时就写NOTNULL,再给默认值。已经上线的表,先补数据,再改约束,顺序不能反。直接加NOTNULL,老数据里的NULL会让变更失败。这一步要排窗口,别在业务高峰做。...改约束前,先跑一遍空值统计。SELECTCOUNT(*)FROMtWHEREcolISNULL。有数据就先补,补完再改。大表别直接ALTER,会锁表或吃满IO。用在线改表工具,或者分批补、最后切约束。...默认值也别乱给。NOTNULLDEFAULT''会把空字符串塞进业务里。后面统计时,空串和真实值混在一起。用0还是'',要和业务确认。默认值填错,等于把NULL换了个名字。问题没消失,只是更难查。

10310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑

    几个先搞明白的概念NULL的本质:NULL不是空字符串'',不是0,不是false。它是一个独立的特殊值,表示"这个字段当前没有确定的值"。...空字符串vsNULL:空字符串''是一个确定的值——它就是一个长度为0的字符串。NULL表示"没有值"。''和NULL在数据库中是完全不同的两个概念。...NULL的五大反直觉陷阱陷阱一:WHEREcolumn=NULL查不出任何数据这是新手必踩的坑。...忽略NULL值GROUPBYNULL值被分到同一组避免NULL的设计思路:如果业务上某个字段"必须有值",在建表时就加上NOTNULL约束,并设置默认值:CREATETABLEusers(idINTPRIMARYKEY...,nameVARCHAR(50)NOTNULL,statusTINYINTNOTNULLDEFAULT0,phoneVARCHAR(20)--允许NULL,因为确实可能没登记);能NOTNULL的字段就别留

    93910

    CAS简介

    在CAS中,有这样三个值: V:要更新的变量(var) E:预期值(expected) N:新值(new) 比较并交换的过程如下: 判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了...所以这里的预期值E本质上指的是“旧值” 一、锁? CAS?...CAS 相当于一个乐观锁,比较后,根据比较结果,赋值; 常见的乐观锁使用场景: 数据库 二、juc--java.util.concurrent 1.CAS思想的落地 CAS的实现 2 ABA问题出现 所谓...这个时候使用CAS是检查不出变化的,但实际上却被更新了两次 通过版本号,或者时间戳来解决 AtomicStampedReference 3 可以解决的问题 我们之前计算的时候,用基本类型作为计算,不加锁的时候...+; // } //} //public volatile int num = 0; AtomicInteger num = new AtomicInteger(0

    50210

    《挑战30天C++入门极限》新手入门:C++下的引用类型

    例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用...,而是把引用指向变量,写成这样就对了:(int &test=变量名;)。...< "|" << a << "|" <<test << endl; cin.get(); }   观察并编译运行上面的代码你会发现&a和&test的地址显示是相同的,a和test的值显示也是一样的...,按照最先说的道理应该可以改变a的值呀,为什么在这里却有没有能够改变呢?   ...temp 变量,而后test获得的却是temp+12.f 改变的是temp而不是a,所以就出现了a和test显示的值不同的情况,这里要特别注意,这是一个很容易混淆的地方,在编写程序的时候要特别仔细,以免出现了问题却检查不出为什么

    73920

    PLC 程序评审清单:7 类检查项、7 个证据要件与 P0–P3 分级

    一套跑了三年的博途程序,编译 0 错误、0 警告。投运第三天,空料位时进料输送机还在转,把箱子推到了不该去的地方。编译器只查语法和一致性:块能不能调用、标签类型对不对、指令参数够不够。...类别典型缺陷1结构与调用块存在但从未被调用;调用条件恒为 0;同一 FB 被两处调用却共用一个实例 DB2状态与保持置位没有配对复位;断电保持位未定义初值;停机再启动后执行器自启动3时序与扫描双线圈(同一输出在多个网络被赋值...输出看起来只被一个网络赋值,实际可能被上位机、HMI 脚本或另一个 PLC 通过通信写入。这个信号是保持还是脉冲? 判断"执行器来不及动作"要先确认脉冲宽度,而不是先确认逻辑。...五、编译、仿真、人工,三件事不能互相替代编译查语法和一致性,查不出逻辑;仿真 / 逐扫描推演能验证逻辑行为,查不出接线、物理通道和安全回路;人工确认负责工艺意图、硬件配置和安全评审。...原因很实际:审查和修复混在一起,就分不清"这条缺陷是原本就有,还是改动引入的"。修复是另一条流程,按级别排序、每条带验证方法。

    10310

    【MSQL数据库】MySQL中的NULL

    在 SQL中则是以 NULL 用于标识空值的保留关键字。SQL null是一个状态,而不是一个值。这种用法与大多数编程语言完全不同,其中引用的空值意味着不指向任何对象。 这不应与 0 数值混淆。...占用空间区别 null值在mysql中的占用空间大小也为null,而’ '值在mysql 中为0。...需注意的时候当你的数据库字段里面null值的时候,你的a中有为null的值则是查不出来为null的行的。 select * from table where a !...即使要在表中储存「没有值」的字段,还是有可能不使用 NULL 的,考虑使用 0、特殊值或空字符串来代替它。...总结: 在创建MySQL表示尽量要限制not NULL 且给初始值为 ’ ’ 或 0; NULL值在mysql数据库中是占有存储的, ’ ’ 是不占用的。 如果某一列有NULL值,且以此列创建索引。

    5K10

    SQL语句在MYSQL中的运行过程和各个组件的介绍

    Mysql的组件有哪些? mysql是由两层组成的:客户端,连接器,查询缓存(MYSQL8.0以后没有这个数据)分析器,优化器,执行期,存储引擎。 二.各个组件所负责的责任是什么?...连接器: 权限校验,查看登录用户是否有权限访问数据库,如果出错就会出现(Access denied for user)然后运行程序就结束了如果连接成功连接器就会去查看这个用户的权限,即以后的权限逻辑都是依赖于次权限...长连接:当用户在一次连接后不断开频繁使用,(长连接)但是会出现MysqL的内存飙升的问题,因为长连接里面的的对象不会去被销毁的会一直积压,只有当断开连接的时候才会进行销毁,所以可以设置默认的值进行断开连接...当一个表频繁被更新的时候所以说大部分都是查不出来的,但是针对于表数据会定时刷新或者不一些不会经常改变的数据,则是可以的, 设置查询是否查询缓存,可以将query_cache_type设置成DEMAND...如:ID =10)则判断是否符合条件存在就存在结果集中; 继续取下一行,重复判断直到表中的最后一行 返回收集的结果集 对于有索引的表,执行逻辑也差不多。

    3K30

    MongoDB数据插入、删除、更新、批量更新某个字段

    _id},{$set:{"outTradeNo1": item.outTradeNo2}}) } ) 查询出xx医院和不已2开头的openId的所有记录,并且将每条记录的outTradeNo2赋值给...强硬的更新会用新的文档代替老的文档  2. insertOrUpdate操作  目的:查询器查出来数据就执行更新操作,查不出来就替换操作  做法: db....4.7 $pop修改器  $pop修改器从指定数组删除一个值1删除最后一个数值,-1删除第一个数值。...// 修改器名称:$pullAll // 语法:{ $pullAll: { field : array} } // example: { $pullAll: { database: ["MySQL","...这对于操作查询以及执行其他需要取值和赋值风格的原子性操作来说是十分方便的。 findAndModify命令中每个键对应的值如下所示。 findAndModify 字符窜,集合名。

    28.3K73

    MYSQL MVCC实现原理详解

    当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。...undefined 2 kong 1 undefined 3 qu 3 undefined 事务3执行完毕,开始执行事务2 语句2,由于事务2只能查询创建时间小于等于2的,所以事务3新增的记录在事务2中是查不出来的...mi 1 undefined 2 kong 1 4 2 fan 4 undefined 事务4执行完毕,开始执行事务2 语句2,由于事务2只能查询创建时间小于等于2的,所以事务修改的记录在事务2中是查不出来的...,这样就保证了事务在两次读取时读取到的数据的状态是一致的 DELETE 假设当执行事务2的过程中,准备执行语句(2)时,开始执行事务5: transaction session 5: start transaction...undefined 2 kong 1 5 事务5执行完毕,开始执行事务2 语句2,由于事务2只能查询创建时间小于等于2、并且过期时间大于等于2,所以id=2的记录在事务2 语句2中,也是可以查出来的,这样就保证了事务在两次读取时读取到的数据的状态是一致的

    2.1K41
    领券