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