首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么MySQL不建议使用NULL作为列默认值?

译者:guangsu. blog.csdn.net/qq_30549099/article/details/107395521 通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下...NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束....有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降....列中使用NULL值容易引发不受控制的事情发生,有时候还会严重托慢系统的性能....根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL.

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

    为什么MySQL不建议使用NULL作为列默认值?

    今天来分享一道美团高频面试题,5 分钟搞懂“为什么 MySQL 不建议使用 NULL 作为列默认值?”。...对于这个问题,通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引,所以上述说法有漏洞。...着急的人拉到最下边看结论 前言 NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,MySQL会默认的为我们添加上NULL约束。...+---------+------+------+----------+-----------------------+ 1 row in set, 1 warning (0.00 sec) 总结 列中使用...(就像额外的标志位一样) 根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL。

    41520

    MySQL timestamp类型列值自动更新

    刨根问底 在create table语句中,对第一个出现的timestamp类型字段的定义会有如下几种情况: 使用DEFAULT CURRENT_TIMESTAMP,表示列值为当前时间戳但不会自动更新;...使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示列值为当前时间戳并且自动更新,也就是每次更新记录都会自动更新该列值为当前时间戳; 没有使用...ON UPDATE CURRENT_TIMESTAMP; 没有使用DEFAULT CURRENT_TIMESTAMP,而使用了ON UPDATE CURRENT_TIMESTAMP,列值默认为0并且自动更新...对于使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP进行定义的列,需要注意的是如果该字段值没有发生变化,将不会进行更新,而且对于多个使用DEFAULT...CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP进行定义的列,mysql只会更新第一个使用它定义的列。

    3.8K70

    PostgreSQL列存增加更新和删除功能

    PostgreSQL列存增加更新和删除功能 Hydra是企业级数据仓库的开源替代品。速度快且功能丰富,开发人员可以更快的构建更好的分析。支持列存PG的更新和删除是#1客户功能请求,现在GA了。...之前博文“如何为分析构建最快的PG数据库”中,回顾了Hydra团队如何将列存、向量化和查询并行化添加到PG中,以及使用ClickBench的基准测试结果。目前对WHERE进行了向量化。...每个chunk列在该表都有记录,因此执行过滤(WHERE)时,将根据最小值和最大值在读取chunk前检查这些值。 由于Hydra列存最初不可变,仅能追加,需要一些方法来标记列存外更新和删除的行。...该表几乎是完全静态的——除了mask之外的所有列都不会改变。mask是一个字节数组,其中每个位对应块中的一行--对于每个块,最多使用 1125 个字节。最初所有位都设置为零(可见)。...Hydra的列存DELETE命令使用每个row_mask行的mask列逻辑标记已经删除的行,并在未来查询中隐藏他们。

    1.2K40

    记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

    更新成 9003 的时候,主键冲突,整个 UPDATE 中止, 9000 更新成的 9001 会回滚, 9003 ~ 9005 还未执行更新   如果使用 IGNORE ,会是什么情况了?...我们先来看这么一个问题,假设某列被声明了 NOT NULL ,然而我们更新这列成 NULL   会发生什么    我们看下 SQL_MODE ,执行 SELECT @@sql_mode; 得到结果...如果我们关闭严格模式,再看看执行结果 name 字段声明成了 NOT NULL ,非严格 SQL 模式下,将 name 设置成 NULL 是成功的,但更改的值并非 NULL ,而是 VARCHAR 类型的默认值... NULL ,会将字段值设置字段类型对应的默认值   关于字段类型的默认值,可查看:Data Type Default Values   关于 sql_mode ,可查看:Server SQL Modes... MySQL 一般都是严格模式,所以大家知道有 value DEFAULT 这回事就够了   SET 字段顺序   针对如下 SQL   想必大家都很清楚   然而,以下 SQL 中的 name 列的值会是多少

    94510

    【protobuf】四、proto3语法详解③ -- 默认值 && 消息更新规则 && option选项

    默认值 ​ 反序列化消息时,如果被反序列化的二进制序列中不包含某个字段,反序列化对象中相应字段时,就会设置为该字段的默认值。...不同的类型对应的默认值不同: 对于 字符串,默认值为空字符串 对于 字节,默认值为空字节 对于 布尔值,默认值为 false 对于 数值类型,默认值为 0 对于 枚举,默认值是第一个定义的枚举值, 必须为...消息的更新规则 一、更新规则 ​ 如果现有的消息类型已经不再满足我们的需求,例如需要扩展一个字段,在不破坏任何现有代码的情况下更新消息类型非常简单。...删除内容: 若是移除老字段,要保证不再使用移除字段的字段编号。正确的做法是保留字段编号(reserved),以确保该编号将不能被重复使用。不建议直接删除或注释掉字段。...二、保留字段 reserved ​ 如果通过【删除】或【注释掉】字段来更新消息类型,未来的用户在添加新字段时,有可能会使用以前已经存在,但已经被删除或注释掉的字段编号,将来使用该 .proto 的旧版本时的程序会引发很多问题

    10610

    关于设置MySQL中create_time和update_time默认值和实时更新

    最近在做一个公司内部使用的数据导出工具,我主要负责后端接口层的开发 。开发框架选择Spring Boot框架,数据库选用MySQL 数据库。在建库建表和同事沟通过程中,有了如下的思考。...那么,涉及到时间字段的设置时,都会对其设置默认值和update_time字段设置实时更新,接下来梳理其使用方式。...MySQL给时间字段设置默认值 建表语句: CREATE TABLE `test` ( `id` int COMMENT 'ID', `text` varchar(255) DEFAULT '...' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DEFAULT now()表示当数据插入数据库时,create_time和update_time默认值为当前时间 实时更新...,后续如涉及到时间更新的操作,推荐此方法进行实现。

    2.5K10
    领券