数据表是关系数据库中真正存放业务数据的核心对象。一个数据库中可以包含多张表,而每张表都由字段(列)和记录(行)组成。设计好数据表结构,是后续插入、查询、更新、删除和性能优化的基础。
设计数据表时,至少要先明确以下几点:
- 这张表要存什么业务对象。
- 每个字段保存什么信息。
- 字段的数据类型、长度、默认值是否合理。
- 哪个字段作为主键。
- 是否需要和其他表建立关联关系。
例如,设计一个用户表时,可以先抽象出如下字段:
id:用户编号name:姓名sex:性别mobile:手机号created_at:创建时间
一个结构清晰的数据表,通常还会考虑:
- 字段是否允许
NULL - 是否需要
DEFAULT - 是否需要
COMMENT - 是否需要索引
- 是否需要主键、唯一约束、外键约束
创建数据表最常用的语句是 CREATE TABLE,基本语法如下:
CREATE TABLE 表名 (
字段名1 数据类型 [约束条件],
字段名2 数据类型 [约束条件],
...
[表级约束]
);下面是一个简单示例:
CREATE TABLE `user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名',
`sex` tinyint NOT NULL DEFAULT 0 COMMENT '性别:0保密,1男,2女',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
);执行成功后,就创建了一张名为 user 的数据表。
常见字段约束说明:
NOT NULL:该字段不能为空DEFAULT:设置默认值AUTO_INCREMENT:自增,常用于整数主键COMMENT:字段注释PRIMARY KEY:主键约束
主键用于唯一标识表中的每一条记录,一张表只能有一个主键。主键字段通常具备以下特点:
- 值不能重复
- 值不能为空
- 尽量稳定,不要频繁修改
建表时可以直接定义主键:
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
age tinyint unsigned DEFAULT NULL,
PRIMARY KEY (id)
);也可以定义联合主键:
CREATE TABLE score (
student_id int NOT NULL,
course_id int NOT NULL,
score decimal(5,2) DEFAULT NULL,
PRIMARY KEY (student_id, course_id)
);联合主键适合“多个字段组合后才能唯一确定一条记录”的场景,例如某个学生在某门课程中的成绩。
一般业务中,如果没有特别强的自然主键,常见做法是:
- 使用单独的自增整数列作为主键。
- 把真正的业务唯一性约束放到
UNIQUE或其他业务规则中处理。
外键用于建立表与表之间的关联关系,通常引用另一张表的主键或唯一键。
例如,一个班级表和学生表之间可以建立这样的关系:
CREATE TABLE class (
id int NOT NULL AUTO_INCREMENT,
class_name varchar(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
class_id int NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_student_class
FOREIGN KEY (class_id) REFERENCES class(id)
);上面这段 SQL 表示:
student.class_id是外键- 它引用
class.id - 学生表中的班级编号必须在班级表中存在
外键的作用主要有两个:
- 保证引用数据的有效性
- 明确数据表之间的关系
需要注意:
- MySQL 中外键通常使用
InnoDB存储引擎 - 被引用列通常应当是主键或唯一键
- 删除或更新主表记录时,要考虑从表中的关联数据
如果希望在删除主表数据时自动处理从表数据,还可以加上级联规则,例如:
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
class_id int NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_student_class
FOREIGN KEY (class_id) REFERENCES class(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);这表示:
- 主表记录删除时,从表对应记录也自动删除
- 主表主键更新时,从表外键值同步更新
创建数据表并不只是把字段列出来,更重要的是把数据类型、约束和表之间的关系设计清楚。一个设计合理的表结构,能明显减少后续数据异常、重复数据和维护成本。