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
);
在这个示例中,username
和 email
列被定义为非空列。如果尝试插入一条记录时,username
或 email
为空,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 中一种简单但强大的工具,用于确保表中的某些列始终包含有效数据。通过使用非空约束,你可以提高数据的完整性,避免因缺失数据导致的逻辑错误。
附加资源
练习
- 创建一个名为
employees
的表,包含id
、name
和hire_date
列,确保name
和hire_date
列不允许为空。 - 尝试向
employees
表中插入一条name
为空的记录,观察 PostgreSQL 的行为。 - 使用
ALTER TABLE
语句为employees
表的id
列添加非空约束。
通过这些练习,你将更好地理解非空约束的作用和使用方法。