在最开始的几节课里,我们已经打下了关系型数据库和 PostgreSQL 的基础,学会了怎么用 psql 和 pgAdmin,也知道了怎么创建和管理数据库。现在,是时候来搞定关系型数据库的主要“积木”——表了。所有数据都存在表里,之后我们可以对它们做筛选、排序或者 join。
在 PostgreSQL 里创建表用的就是 CREATE TABLE 命令。这个命令描述了表的结构:表名、列名和它们的数据类型。
命令的基本结构
基本语法长这样:
CREATE TABLE 表名 (
列1 数据类型 constraints,
列2 数据类型 constraints,
...
);
拆开讲讲:
表名– 表的名字(比如students)。列1– 列的名字(比如id、name)。数据类型– 列的数据类型(比如INTEGER、VARCHAR)。constraints– 数据的约束(比如NOT NULL、PRIMARY KEY)。
现在我们来创建第一个表。
创建表的例子
场景:在学习用的数据库里要存学生的信息。我们来建一个 students 表,字段有:
id:学生的唯一标识(自增);name:学生的名字(字符串,最多 100 个字符);age:学生的年龄(正整数)。
CREATE TABLE students (
id SERIAL PRIMARY KEY, -- 学生唯一ID
name VARCHAR(100), -- 名字
age INTEGER -- 年龄
);
这里发生了什么:
id SERIAL PRIMARY KEY:创建了id这一列,会自动生成唯一数字(1, 2, 3...),而且它是表的主键。name VARCHAR(100):创建了文本列,VARCHAR(100)表示字符串最多 100 个字符。age INTEGER:创建了数字列,用来存年龄。
现在,如果你在 psql 或 pgAdmin 里执行这个语句,students 表就会被创建出来。
列的数据类型
建表的时候,选对每一列的数据类型很重要。PostgreSQL 提供了很多类型,先从最常用的说起。
| 数据类型 | 说明 | 值的例子 |
|---|---|---|
INTEGER |
整数。适合存年龄、数量、ID 之类的。 | 1, 42, 100 |
VARCHAR(n) |
长度最多 n 的字符串。适合长度有限的文本。 |
'Alice', 'Bob' |
TEXT |
不限长度的字符串。用来存很长的文本(比如产品描述)。 | 'Very long text...' |
DATE |
只有日期没有时间。用来记录生日、事件日期。 | 2023-10-12 |
BOOLEAN |
布尔类型:TRUE 或 FALSE。适合做标记(比如完成/未完成)。 |
TRUE, FALSE |
怎么选合适的数据类型
- 存数字就用
INTEGER。 - 已知长度限制的字符串——用
VARCHAR(n)。 - 没限制的文本——用
TEXT。 - 日期和时间用
DATE或TIMESTAMP。
例子:创建 courses 表
假设我们还要在数据库里存课程的信息。每个课程有:
id:唯一标识;name:课程名(字符串,最多 100 个字符);description:课程描述(长文本);start_date:课程开始日期。
SQL 代码:
CREATE TABLE courses (
id SERIAL PRIMARY KEY, -- 课程唯一ID
name VARCHAR(100), -- 课程名
description TEXT, -- 描述
start_date DATE -- 开始日期
);
动手练习
现在轮到你来建表啦!任务如下:
- 创建一个
teachers表,字段有:id:唯一标识。name:老师名字(字符串,最多 50 个字符)。subject:他/她教的科目(字符串,最多 50 个字符)。hire_date:入职日期。
可以用下面的代码:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
subject VARCHAR(50),
hire_date DATE
);
建完表后,在 psql 里用 \d teachers 命令,确认表已经建好。
建表时常见的坑
刚开始玩表的时候,容易踩坑。下面是常见的几种情况:
表名或列名写错。 在 PostgreSQL 里名字大小写不敏感,但如果你用 " 把名字括起来,就要小心了。比如 CREATE TABLE "MyTable" 会建一个叫 "MyTable" 的表,而 mytable 就不是它的名字了。
数据类型写错。 如果写了不存在的数据类型,SQL 会报错。
CREATE TABLE example (
column1 STRANGE_TYPE
);
这个语句不会成功,因为 STRANGE_TYPE 根本不存在。
忘了 PRIMARY KEY。 如果没加主键,表还是能建出来,但以后要唯一标识行就麻烦了。
GO TO FULL VERSION