跳到主要内容

PostgreSQL 非空约束

在 PostgreSQL 中,非空约束(NOT NULL) 是一种用于确保表中某一列不允许存储空值(NULL)的约束。空值表示缺失或未知的数据,但在某些情况下,我们可能希望强制要求某些列必须包含有效数据。非空约束正是为此设计的。

什么是非空约束?

非空约束是一种列级约束,它强制要求表中的某一列不能包含空值。如果尝试插入或更新数据时,该列的值为空,PostgreSQL 将拒绝操作并返回错误。

为什么使用非空约束?

  • 数据完整性:确保关键字段始终包含有效数据,避免因缺失数据导致的逻辑错误。
  • 查询优化:非空列在某些情况下可以提高查询性能,因为数据库引擎不需要处理空值。
  • 业务规则:某些业务场景要求某些字段必须填写,例如用户的电子邮件地址或订单的创建时间。

如何定义非空约束?

在创建表时,可以通过在列定义中添加 NOT NULL 关键字来定义非空约束。也可以在表创建后,使用 ALTER TABLE 语句添加或删除非空约束。

示例 1:创建表时定义非空约束

以下是一个创建表时定义非空约束的示例:

sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

在这个示例中,usernameemail 列被定义为非空列。如果尝试插入一条记录时,usernameemail 为空,PostgreSQL 将返回错误。

示例 2:插入数据时的行为

尝试插入一条 username 为空的记录:

sql
INSERT INTO users (username, email) VALUES (NULL, 'user@example.com');

PostgreSQL 将返回以下错误:

ERROR:  null value in column "username" violates not-null constraint
DETAIL: Failing row contains (1, null, user@example.com, 2023-10-01 12:00:00).

示例 3:修改表以添加非空约束

如果表已经存在,可以使用 ALTER TABLE 语句为现有列添加非空约束:

sql
ALTER TABLE users
ALTER COLUMN created_at SET NOT NULL;

如果 created_at 列中已经存在空值,PostgreSQL 将拒绝添加约束并返回错误。你需要先更新这些记录,确保它们包含有效值。

实际应用场景

场景 1:用户注册

在用户注册系统中,通常要求用户提供用户名和电子邮件地址。这些字段是必填项,因此可以在数据库中使用非空约束来确保数据的完整性。

sql
CREATE TABLE registrations (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
registered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

场景 2:订单系统

在订单系统中,订单的创建时间和订单号是必填项。可以使用非空约束来确保这些字段不会为空。

sql
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_number VARCHAR(20) NOT NULL,
customer_id INT NOT NULL,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

总结

非空约束是 PostgreSQL 中一种简单但强大的工具,用于确保表中的某些列始终包含有效数据。通过使用非空约束,你可以提高数据的完整性,避免因缺失数据导致的逻辑错误。

附加资源

练习

  1. 创建一个名为 employees 的表,包含 idnamehire_date 列,确保 namehire_date 列不允许为空。
  2. 尝试向 employees 表中插入一条 name 为空的记录,观察 PostgreSQL 的行为。
  3. 使用 ALTER TABLE 语句为 employees 表的 id 列添加非空约束。

通过这些练习,你将更好地理解非空约束的作用和使用方法。