数据表是关系数据库中真正存放业务数据的核心对象。一个数据库中可以包含多张表,而每张表都由字段(列)和记录(行)组成。设计好数据表结构,是后续插入、查询、更新、删除和性能优化的基础。
设计数据表时,至少要先明确以下几点:
例如,设计一个用户表时,可以先抽象出如下字段:
id:用户编号name:姓名sex:性别mobile:手机号created_at:创建时间一个结构清晰的数据表,通常还会考虑:
NULLDEFAULTCOMMENT创建数据表最常用的语句是 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外键的作用主要有两个:
需要注意:
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
);
这表示:
创建数据表并不只是把字段列出来,更重要的是把数据类型、约束和表之间的关系设计清楚。一个设计合理的表结构,能明显减少后续数据异常、重复数据和维护成本。