PostgreSQL 默认值
介绍
在 PostgreSQL 中,默认值(Default Value)是一种约束,用于为表中的列指定一个默认值。当插入新行时,如果未显式提供该列的值,PostgreSQL 将自动使用默认值填充该列。默认值可以是一个常量值、表达式或函数的结果。
默认值在数据库设计中非常有用,尤其是在处理可选字段或需要自动填充某些列(如创建时间戳)时。
语法
在创建表时,可以通过 DEFAULT
关键字为列指定默认值。语法如下:
CREATE TABLE table_name (
column_name data_type DEFAULT default_value
);
其中:
table_name
是表的名称。column_name
是列的名称。data_type
是列的数据类型。default_value
是该列的默认值。
示例
示例 1:设置默认值为常量
假设我们有一个 users
表,其中包含一个 status
列,表示用户的状态。我们希望默认情况下,所有新用户的状态为 active
。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
status VARCHAR(20) DEFAULT 'active'
);
插入新用户时,如果未提供 status
列的值,PostgreSQL 将自动使用默认值 active
:
INSERT INTO users (username) VALUES ('john_doe');
查询结果:
SELECT * FROM users;
输出:
id | username | status |
---|---|---|
1 | john_doe | active |
示例 2:设置默认值为函数
我们可以使用函数来生成默认值。例如,使用 CURRENT_TIMESTAMP
函数为 created_at
列设置默认值为当前时间戳。
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
插入新订单时,如果未提供 created_at
列的值,PostgreSQL 将自动使用当前时间戳填充该列:
INSERT INTO orders (product_name) VALUES ('Laptop');
查询结果:
SELECT * FROM orders;
输出:
id | product_name | created_at |
---|---|---|
1 | Laptop | 2023-10-01 12:34:56 |
CURRENT_TIMESTAMP
函数返回当前日期和时间,精确到秒。
示例 3:设置默认值为表达式
我们还可以使用表达式作为默认值。例如,假设我们有一个 products
表,其中包含一个 discounted_price
列,表示折扣后的价格。我们可以将默认值设置为原价的 90%。
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price NUMERIC(10, 2) NOT NULL,
discounted_price NUMERIC(10, 2) DEFAULT (price * 0.9)
);
插入新产品时,如果未提供 discounted_price
列的值,PostgreSQL 将自动计算折扣后的价格:
INSERT INTO products (name, price) VALUES ('Smartphone', 1000);
查询结果:
SELECT * FROM products;
输出:
id | name | price | discounted_price |
---|---|---|---|
1 | Smartphone | 1000.00 | 900.00 |
在使用表达式作为默认值时,确保表达式的结果与列的数据类型兼容。
实际应用场景
场景 1:自动填充创建时间
在许多应用中,记录创建时间是非常常见的需求。通过为 created_at
列设置默认值为 CURRENT_TIMESTAMP
,可以自动记录每行数据的创建时间,而无需手动插入。
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
场景 2:设置默认状态
在用户管理系统中,新用户的默认状态通常为 active
。通过为 status
列设置默认值,可以简化插入操作。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
status VARCHAR(20) DEFAULT 'active'
);
场景 3:计算默认值
在电商系统中,商品的折扣价格通常基于原价计算。通过为 discounted_price
列设置默认值为表达式,可以自动计算折扣价格。
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price NUMERIC(10, 2) NOT NULL,
discounted_price NUMERIC(10, 2) DEFAULT (price * 0.9)
);
总结
PostgreSQL 的默认值约束为表的列提供了灵活且强大的默认值设置功能。通过使用常量、函数或表达式作为默认值,可以简化数据插入操作,并确保数据的完整性和一致性。
在实际应用中,默认值常用于自动填充时间戳、设置默认状态或计算衍生值。掌握默认值的使用,将有助于你设计更高效、更可靠的数据库表结构。
附加资源
练习
- 创建一个
employees
表,包含id
、name
和hire_date
列,其中hire_date
列的默认值为当前日期。 - 在
products
表中添加一个stock_quantity
列,默认值为0
。 - 修改
users
表,将status
列的默认值改为inactive
。
通过完成这些练习,你将更好地理解 PostgreSQL 默认值的应用。