创建时间: 2026-09-01最后更新: 2026-09-01

1. 表

假如我们要创建一张记录任务信息的表,那么,这张表可能会包含如下字段

task-shape.txt
1
任务
2
id:唯一标识
3
title:标题
4
description:描述
5
status:状态
6
priority:优先级
7
due_at:截止时间
8
created_at:创建时间
9
updated_at:更新时间

这份结构不是从代码类直接复制出来的。数据库中的列应该反映长期需要保存和查询的数据。只在接口响应中临时计算的字段,不一定要进入表中。

当表中有多条数据时,从可视化的角度来看,表内容会呈现为多行多列的表格。

idtitledescriptionstatusprioritydue_atcreated_atupdated_at
1任务1任务1的描述todo02026-01-01 00:00:002026-01-01 00:00:002026-01-01 00:00:00
2任务2任务2的描述todo02026-01-01 00:00:002026-01-01 00:00:002026-01-01 00:00:00
3任务3任务3的描述todo02026-01-01 00:00:002026-01-01 00:00:002026-01-01 00:00:00

表结构也不是一次设计后永远不变。业务会增加字段、调整规则,数据库因此提供了创建、修改和删除结构的能力。

2. 创建

使用 CREATE TABLE 创建第一张完整的业务表:

create-tasks.sql
01
CREATE TABLE tasks (
02
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
03
title text NOT NULL,
04
description text,
05
status text NOT NULL DEFAULT 'todo',
06
priority smallint NOT NULL DEFAULT 0,
07
due_at timestamptz,
08
created_at timestamptz NOT NULL DEFAULT now(),
09
updated_at timestamptz NOT NULL DEFAULT now()
10
);

一条字段定义通常由这些部分组成:

字段名数据类型约束默认值
idbigintPRIMARY KEYGENERATED ALWAYS AS IDENTITY(数据库自动生成)
titletextNOT NULL无
descriptiontext无无
statustextNOT NULL'todo'
prioritysmallintNOT NULL0
due_attimestamptz无无
created_attimestamptzNOT NULLnow()
updated_attimestamptzNOT NULLnow()

GENERATED ALWAYS AS IDENTITY 表示由数据库按照 identity 规则生成 id,它不是普通的 DEFAULT 表达式,因此单独放在“默认值”列中标注生成方式。ALWAYS 默认不接受应用手动提供的编号;确实需要导入指定编号时,必须显式使用 OVERRIDING SYSTEM VALUE。

id 使用 identity 自动生成。应用插入任务时不用自己查询当前最大编号,也不应该用「最大编号加一」生成主键,因为多个请求同时执行时可能得到相同结果。

正在验证登录状态
请稍候,验证完成后将继续显示文章内容