mysql菜鸟教程
4.4 创建表:定义数据的“模板”
如果说数据库是一个存放数据的“仓库”,那么表就是这个仓库里一个个结构化的“货架”。每个“货架”都有固定的格式,用来存放同一类物品。在数据库中,我们通过创建表来为数据定义精确的“模板”,规定每条数据应该长什么样。
一、理解表结构:一张表的构成要素
想象一下你要设计一个Excel表格来记录班级同学信息,你需要提前想好:
表头(列名):比如“学号”、“姓名”、“年龄”。
每列的数据类型:“学号”是数字,“姓名”是文本,“年龄”是数字。
约束规则:“学号”不能重复,“姓名”不能为空。
在MySQL中,创建表就是通过 CREATE TABLE 语句,将以上规划用SQL语言精确地描述出来。
二、CREATE TABLE 语句核心语法
创建表的基本语法结构如下:
CREATE TABLE [IF NOT EXISTS] 表名 ( 列1名 数据类型 [列约束], 列2名 数据类型 [列约束], 列3名 数据类型 [列约束], ... [表级约束] ) [表选项];
我们来分解一下这个“配方”中的关键部分:
三、从零开始:创建你的第一张表
让我们从最简单的表开始。假设我们要创建一个 users 表,只记录用户ID和名字。
-- 先选择一个数据库 USE my_first_db; -- 创建 users 表 CREATE TABLE users ( id INT, name VARCHAR(100) );
执行后,Query OK, 0 rows affected 提示表已创建成功。这个表很简单,只有两个字段,没有任何约束。
步骤一:为表添加主键 (PRIMARY KEY)
主键是表中唯一标识每一行数据的列,不能重复,也不能为NULL。通常使用id列作为主键。
CREATE TABLE users ( id INT PRIMARY KEY, -- 将 id 列设置为主键 name VARCHAR(100) );
步骤二:让主键自动增长 (AUTO_INCREMENT)
对于主键,我们通常希望数据库能自动生成一个唯一的、递增的数字。AUTO_INCREMENT 就是为此而生。
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, -- 自动递增的主键 name VARCHAR(100) );
插入数据时,可以不为id列指定值,数据库会自动填充(1, 2, 3...)。
步骤三:确保数据完整性 (NOT NULL, DEFAULT)
NOT NULL:约束该列必须有值,不能为NULL。
DEFAULT:当插入数据未指定该列值时,使用的默认值。
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, -- 姓名是必填项,不能为空 age TINYINT UNSIGNED DEFAULT 18, -- 年龄非必填,默认18岁 email VARCHAR(100) );
步骤四:使用表级约束与表选项
有时,主键由多列组成(复合主键),或者我们需要指定表的默认字符集和存储引擎。
CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT, country_code CHAR(2), phone VARCHAR(20), name VARCHAR(100) NOT NULL, PRIMARY KEY (id), -- 表级方式定义主键(与列级效果相同) UNIQUE KEY (country_code, phone) -- 表级唯一约束:国家码+手机号组合必须唯一 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这里:
UNIQUE KEY (country_code, phone) 是一个表级约束,它保证 country_code 和 phone 的组合在整个表中是唯一的。
ENGINE=InnoDB 指定使用InnoDB存储引擎(支持事务,MySQL 8.0默认)。
DEFAULT CHARSET=utf8mb4 确保表默认使用支持中文及所有Unicode字符的字符集。
四、综合实战:创建“学生信息表”
现在,我们来设计一个功能相对完整的 students 表。
-- 确保在正确的数据库中
USE school_db;
-- 创建学生表
CREATE TABLE IF NOT EXISTS students (
-- 主键:自增ID
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '学生主键ID',
-- 学生基本信息:必须唯一且非空
student_number CHAR(10) NOT NULL UNIQUE COMMENT '学号,唯一',
name VARCHAR(50) NOT NULL COMMENT '学生姓名',
-- 可选信息:有默认值
gender ENUM('男', '女', '其他') DEFAULT '其他' COMMENT '性别',
age TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',
birthday DATE COMMENT '出生日期',
-- 联系信息:可为空
email VARCHAR(100) COMMENT '电子邮箱',
phone VARCHAR(20) COMMENT '手机号',
-- 元信息:自动记录时间
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表';代码解析:
主键:student_id 是自增无符号整数主键。
业务唯一键:student_number(学号)本身也具有 UNIQUE 和 NOT NULL 约束,保证了业务上的唯一性。
枚举类型:gender 字段使用 ENUM,限定只能从三个选项中选一个。
默认值:age 字段默认为18,gender 默认为'其他'。
自动时间戳:
created_at 在记录插入时自动设置为当前时间。
updated_at 在记录插入或更新时,都会自动更新为当前时间。这是记录数据变更的利器。
注释:使用 COMMENT 为表和每个列添加说明,这对于文档和维护非常重要。
五、查看与确认
创建表后,你可以使用以下命令来验证表结构:
-- 查看当前数据库中的所有表 SHOW TABLES; -- 查看 students 表的详细结构(字段、类型、约束等) DESCRIBE students; -- 或者使用缩写 DESC students; -- 查看创建 students 表的完整SQL语句(非常有用) SHOW CREATE TABLE students;
六、删除表(危险!慎用)
如果表设计有误或不再需要,可以删除。此操作不可逆,会永久删除表及其所有数据。
-- 直接删除(危险) DROP TABLE students; -- 安全删除(如果存在才删除,推荐在脚本中使用) DROP TABLE IF EXISTS students;
总结
命名规范建议:
表名和列名使用小写字母、数字和下划线的组合。
表名使用复数名词(如 users, products),而关联表可用单数(如 user_profile)。
主键列通常简称为 id,外键列通常为 关联表名_id(如 user_id)。

发表评论
所有评论