Skip to content

Latest commit

 

History

History
167 lines (124 loc) · 4.48 KB

File metadata and controls

167 lines (124 loc) · 4.48 KB

创建数据表

数据表是关系数据库中真正存放业务数据的核心对象。一个数据库中可以包含多张表,而每张表都由字段(列)和记录(行)组成。设计好数据表结构,是后续插入、查询、更新、删除和性能优化的基础。

数据表的结构设计

设计数据表时,至少要先明确以下几点:

  1. 这张表要存什么业务对象。
  2. 每个字段保存什么信息。
  3. 字段的数据类型、长度、默认值是否合理。
  4. 哪个字段作为主键。
  5. 是否需要和其他表建立关联关系。

例如,设计一个用户表时,可以先抽象出如下字段:

  • id:用户编号
  • name:姓名
  • sex:性别
  • mobile:手机号
  • created_at:创建时间

一个结构清晰的数据表,通常还会考虑:

  • 字段是否允许 NULL
  • 是否需要 DEFAULT
  • 是否需要 COMMENT
  • 是否需要索引
  • 是否需要主键、唯一约束、外键约束

CREATE TABLE语句

创建数据表最常用的语句是 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)
);

联合主键适合“多个字段组合后才能唯一确定一条记录”的场景,例如某个学生在某门课程中的成绩。

一般业务中,如果没有特别强的自然主键,常见做法是:

  1. 使用单独的自增整数列作为主键。
  2. 把真正的业务唯一性约束放到 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
  • 学生表中的班级编号必须在班级表中存在

外键的作用主要有两个:

  1. 保证引用数据的有效性
  2. 明确数据表之间的关系

需要注意:

  • 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
);

这表示:

  • 主表记录删除时,从表对应记录也自动删除
  • 主表主键更新时,从表外键值同步更新

小结

创建数据表并不只是把字段列出来,更重要的是把数据类型、约束和表之间的关系设计清楚。一个设计合理的表结构,能明显减少后续数据异常、重复数据和维护成本。