为什么建议Mysql字段定义为 NOT NULL

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累


在 MySQL 数据库中,字段定义为 NOT NULL 是一个非常常见的设计习惯,主要是为了提高数据的完整性、性能和逻辑清晰性。以下是字段要求定义为 NOT NULL 的原因及其优势:


01
数据完整性


  • NOT NULL 确保字段必须有值,避免意外的空值插入。

  • 例如,某些字段(如主键、用户名、邮箱等)逻辑上不应该为空,使用 NOT NULL 能保证数据的完整性和可靠性。

  • 避免在业务中对空值处理不当引起错误。

CREATE TABLE users (    id INT PRIMARY KEY NOT NULL,  -- 主键不能为 NULL    username VARCHAR(50) NOT NULL,  -- 用户名不能为空    email VARCHAR(100) NOT NULL  -- 邮箱不能为空);

如果字段允许为 NULL,在实际操作中可能会出现数据缺失的问题,例如:

  • 用户名或邮箱为空,会导致数据的逻辑性被破坏。

  • 数据查询时需要额外判断是否为空,增加复杂性。

02
提高查询性能


  • NOT NULL 字段的查询速度比允许 NULL 的字段更快,因为 MySQL 不需要额外判断字段值是否为 NULL。

  • NULL 值在 MySQL 中有特殊的存储和处理方式,需要额外的存储空间和处理逻辑。

对比:

对于允许 NULL 的字段,每次查询时 MySQL 都需要检查该字段是否为 NULL,这会增加系统的额外开销。对于 NOT NULL 的字段,则直接比较值即可,无需处理空值判断逻辑。


03
避免逻辑错误


  • 在很多情况下,允许 NULL 的字段会导致数据逻辑处理变得复杂。

  • NULL 在 SQL 中有特殊的语义:它表示“未知”或“无值”,与空字符串 '' 或零 0 是不同的。

  • 处理 NULL 时需要额外的注意,否则可能会导致不可预料的错误。

SELECT * FROM orders WHERE status = 'completed';
  • 如果 status 字段允许 NULL,某些记录的 status 值可能是 NULL。

  • NULL 的值不会参与比较,查询结果可能不包含 NULL 的记录。

而如果字段定义为 NOT NULL,可以避免这种情况。


04
简化代码逻辑


  • 如果字段定义为 NOT NULL,开发时可以少写一些空值检查逻辑,代码更简洁,出错概率更低。

  • 对于允许 NULL 的字段,每次使用时都需要判断 NULL 的情况,否则可能导致逻辑漏洞。

// NOT NULL 字段,代码逻辑简单if (user.getUsername().equals("admin")) {    // 执行逻辑}// 如果允许 NULL,就需要额外判断if (user.getUsername() != null && user.getUsername().equals("admin")) {    // 执行逻辑}


05
更适合索引优化


  • 如果字段需要作为索引的一部分,MySQL 通常会要求该字段定义为 NOT NULL,因为 NULL 值在索引中有特殊的处理方式,可能会导致性能问题。

  • 主键(Primary Key)字段必须定义为 NOT NULL,否则会报错。

CREATE TABLE orders (    id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键必须是 NOT NULL    order_number VARCHAR(50) NOT NULL UNIQUE  -- 唯一索引要求 NOT NULL);

如果字段允许 NULL,MySQL 索引中会为 NULL 值占用额外的存储空间,而且查询时需要特殊处理。


06
符合业务需求


  • 在很多业务场景下,字段逻辑上不可能为空,例如用户的名字、年龄、性别等信息。

  • 为了保证数据的正确性,应该通过 NOT NULL 明确字段的非空约束。

CREATE TABLE employees (    employee_id INT NOT NULL,  -- 员工 ID 不能为空    name VARCHAR(100) NOT NULL,  -- 员工姓名不能为空    hire_date DATE NOT NULL  -- 入职日期不能为空);

如果字段允许为 NULL,业务逻辑可能会产生不一致的数据,比如出现一条记录中,员工姓名或入职日期为空的情况。


07
更好的错误提示


  • 如果字段定义为 NOT NULL,在插入或更新数据时,MySQL 会直接报错,提示字段不能为 NULL。

  • 这种提示能帮助开发者快速发现数据问题,而不是在后续业务处理中出现逻辑错误。

INSERT INTO users (id, username, email) VALUES (1NULL'test@example.com');-- 报错:Column 'username' cannot be null


08
特殊情况下允许 NULL 的考虑


虽然 NOT NULL 有很多优点,但也有一些情况下可以允许 NULL:

  1. 某些字段逻辑上确实可能没有值,例如备注字段、某些可选的属性等。

  2. 某些场景下,使用 NULL 可能比使用默认值更合适(如区分 “未填值” 和 “0” 的情况)。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch