SQL 中的 NULL 和 NOT NULL

17 Mar 2025 | 4 分钟阅读

引言

NULL 和 NOT NULL 约束在数据库设计中至关重要。这些约束控制着数据库表中列中值的存在与否,从而影响数据完整性和查询结果。本文将探讨 NULL 和 NOT NULL 约束在 SQL 数据库中的相关性,包括它们的实际实现。

NULL 约束

SQL 中的 NULL 值表示列中数据的缺失。它意味着需要包含的数据是未知的或未定义的。接受 NULL 值的列被认为是可空的。SQL 数据库中的大多数列默认允许 NULL 值,除非使用 NOT NULL 约束另行指定。

NULL 约束示例

考虑这种情况:您有一个名为 Students 的表,用于存储学生信息。让我们创建这个表,包含一些列,其中一列允许 NULL 值。

在此示例中

  • StudentID、FirstName 和 LastName 列被指定为 NOT NULL,确保每条学生记录都必须包含这些列的值。
  • Age 和 Address 列允许 NULL 值,表示年龄和地址信息可能并非所有学生都有。

插入带有 NULL 值的数据

让我们向 Student 表添加一些示例数据。

在此数据中,插入:

  • 第一条记录包含每列的值。
  • 第二条记录的 Age 和 Address 列为 NULL。
  • 第三条记录的 Address 字段为 NULL。

查询 Student 表

此查询将返回以下输出

Null and not null in SQL

输出解释

  • 每一行表示一条学生的记录。
  • 显示了 StudentID、FirstName、LastName、Age 和 Address 列。
  • Age 列接受 NULL 值,因此第二条和第三条记录包含 NULL 的 Age 值。

NOT NULL 约束

相反,NOT NULL 约束强制要求列不能包含 NULL 值。表中的每一行都必须为该特定字段包含一个值。被标记为 NOT NULL 的列被认为是不可空的。

NOT NULL 约束示例

让我们修改 Students 表,使 Age 列为 NOT NULL。

Age 字段将不再接受 NULL 条目,确保每条学生记录都有年龄显示。

尝试进行此更改将导致错误,因为第二条记录的 Age 字段中有一个 NULL 值。但是,假设我们省略此步骤并继续查询 Students 表。

设置字段为 NOT NULL 后查询 Students 表

上述错误阻止了查询的正确执行。尽管如此,在通过更新第二条记录的正确年龄或删除该记录来修复问题后,查询将返回以下结果:

Null and not null in SQL

输出解释

  • 第二条记录,其 Age 列的值为 NULL,已被修改或删除,以满足 NOT NULL 要求。
  • 表中只保存了具有有效年龄的记录。

实际应用

NULL 和 NOT NULL 约束的使用对数据库架构、数据完整性和查询结果有着重大影响。

  • 数据完整性: NOT NULL 约束确保关键数据始终存在,降低了数据不一致和错误的可能。另一方面,NULL 在处理缺失或可选信息时提供了更大的灵活性,但必须小心处理,以避免意外的查询结果。
  • 查询结果: 包含 NULL 值列的 SQL 查询需要特殊处理。如果未能正确处理 NULL,则诸如比较和算术之类的操作可能会产生意外的结果。SQL 提供了 IS NULL 和 IS NOT NULL 等方法来专门处理查询中的 NULL 数据。
  • 索引和性能: NULL 值可能会影响查询和索引的性能。某些数据库系统对 NULL 值的评估方式与非 NULL 值不同,这可能会影响索引的使用和查询优化策略。

最佳实践

  • 在必要的数据字段上使用 NOT NULL 约束,以维护数据完整性和一致性。
  • 在列用于关键操作或约束时,应谨慎允许 NULL 值。
  • 在数据库模式文档中包含 NULL 处理原则和建议,以在应用程序和开发团队之间保持一致性。
  • 在查询中使用正确的 SQL 方法和运算符来处理 NULL 值,以避免意外行为。