跳到主要内容

PostgreSQL 默认值

介绍

在 PostgreSQL 中,默认值(Default Value)是一种约束,用于为表中的列指定一个默认值。当插入新行时,如果未显式提供该列的值,PostgreSQL 将自动使用默认值填充该列。默认值可以是一个常量值、表达式或函数的结果。

默认值在数据库设计中非常有用,尤其是在处理可选字段或需要自动填充某些列(如创建时间戳)时。

语法

在创建表时,可以通过 DEFAULT 关键字为列指定默认值。语法如下:

sql
CREATE TABLE table_name (
column_name data_type DEFAULT default_value
);

其中:

  • table_name 是表的名称。
  • column_name 是列的名称。
  • data_type 是列的数据类型。
  • default_value 是该列的默认值。

示例

示例 1:设置默认值为常量

假设我们有一个 users 表,其中包含一个 status 列,表示用户的状态。我们希望默认情况下,所有新用户的状态为 active

sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
status VARCHAR(20) DEFAULT 'active'
);

插入新用户时,如果未提供 status 列的值,PostgreSQL 将自动使用默认值 active

sql
INSERT INTO users (username) VALUES ('john_doe');

查询结果:

sql
SELECT * FROM users;

输出:

idusernamestatus
1john_doeactive

示例 2:设置默认值为函数

我们可以使用函数来生成默认值。例如,使用 CURRENT_TIMESTAMP 函数为 created_at 列设置默认值为当前时间戳。

sql
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

插入新订单时,如果未提供 created_at 列的值,PostgreSQL 将自动使用当前时间戳填充该列:

sql
INSERT INTO orders (product_name) VALUES ('Laptop');

查询结果:

sql
SELECT * FROM orders;

输出:

idproduct_namecreated_at
1Laptop2023-10-01 12:34:56
备注

CURRENT_TIMESTAMP 函数返回当前日期和时间,精确到秒。

示例 3:设置默认值为表达式

我们还可以使用表达式作为默认值。例如,假设我们有一个 products 表,其中包含一个 discounted_price 列,表示折扣后的价格。我们可以将默认值设置为原价的 90%。

sql
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 将自动计算折扣后的价格:

sql
INSERT INTO products (name, price) VALUES ('Smartphone', 1000);

查询结果:

sql
SELECT * FROM products;

输出:

idnamepricediscounted_price
1Smartphone1000.00900.00
警告

在使用表达式作为默认值时,确保表达式的结果与列的数据类型兼容。

实际应用场景

场景 1:自动填充创建时间

在许多应用中,记录创建时间是非常常见的需求。通过为 created_at 列设置默认值为 CURRENT_TIMESTAMP,可以自动记录每行数据的创建时间,而无需手动插入。

sql
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 列设置默认值,可以简化插入操作。

sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
status VARCHAR(20) DEFAULT 'active'
);

场景 3:计算默认值

在电商系统中,商品的折扣价格通常基于原价计算。通过为 discounted_price 列设置默认值为表达式,可以自动计算折扣价格。

sql
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 的默认值约束为表的列提供了灵活且强大的默认值设置功能。通过使用常量、函数或表达式作为默认值,可以简化数据插入操作,并确保数据的完整性和一致性。

在实际应用中,默认值常用于自动填充时间戳、设置默认状态或计算衍生值。掌握默认值的使用,将有助于你设计更高效、更可靠的数据库表结构。

附加资源

练习

  1. 创建一个 employees 表,包含 idnamehire_date 列,其中 hire_date 列的默认值为当前日期。
  2. products 表中添加一个 stock_quantity 列,默认值为 0
  3. 修改 users 表,将 status 列的默认值改为 inactive

通过完成这些练习,你将更好地理解 PostgreSQL 默认值的应用。