创建时间: 2026-09-01最后更新: 2026-09-01作者: yangbo(2d5d2525a)
1. 表
假如我们要创建一张记录任务信息的表,那么,这张表可能会包含如下字段
task-shape.txt
1任务2id:唯一标识3title:标题4description:描述5status:状态6priority:优先级7due_at:截止时间8created_at:创建时间9updated_at:更新时间
这份结构不是从代码类直接复制出来的。数据库中的列应该反映长期需要保存和查询的数据。只在接口响应中临时计算的字段,不一定要进入表中。
当表中有多条数据时,从可视化的角度来看,表内容会呈现为多行多列的表格。
| id | title | description | status | priority | due_at | created_at | updated_at |
|---|---|---|---|---|---|---|---|
| 1 | 任务1 | 任务1的描述 | todo | 0 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 |
| 2 | 任务2 | 任务2的描述 | todo | 0 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 |
| 3 | 任务3 | 任务3的描述 | todo | 0 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 | 2026-01-01 00:00:00 |
表结构也不是一次设计后永远不变。业务会增加字段、调整规则,数据库因此提供了创建、修改和删除结构的能力。
2. 创建
使用 CREATE TABLE 创建第一张完整的业务表:
create-tasks.sql
01CREATE TABLE tasks (02id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,03title text NOT NULL,04description text,05status text NOT NULL DEFAULT 'todo',06priority smallint NOT NULL DEFAULT 0,07due_at timestamptz,08created_at timestamptz NOT NULL DEFAULT now(),09updated_at timestamptz NOT NULL DEFAULT now()10);
一条字段定义通常由这些部分组成:
| 字段名 | 数据类型 | 约束 | 默认值 |
|---|---|---|---|
id | bigint | PRIMARY KEY | GENERATED ALWAYS AS IDENTITY(数据库自动生成) |
title | text | NOT NULL | 无 |
description | text | 无 | 无 |
status | text | NOT NULL | 'todo' |
priority | smallint | NOT NULL | 0 |
due_at | timestamptz | 无 | 无 |
created_at | timestamptz | NOT NULL | now() |
updated_at | timestamptz | NOT NULL | now() |
GENERATED ALWAYS AS IDENTITY 表示由数据库按照 identity 规则生成 id,它不是普通的 DEFAULT 表达式,因此单独放在“默认值”列中标注生成方式。ALWAYS 默认不接受应用手动提供的编号;确实需要导入指定编号时,必须显式使用 OVERRIDING SYSTEM VALUE。
id 使用 identity 自动生成。应用插入任务时不用自己查询当前最大编号,也不应该用「最大编号加一」生成主键,因为多个请求同时执行时可能得到相同结果。
正在验证登录状态
请稍候,验证完成后将继续显示文章内容