mysql菜鸟教程

首页 >> mysql菜鸟教程

4.4 创建表:定义数据的“模板”

      如果说数据库是一个存放数据的“仓库”,那么就是这个仓库里一个个结构化的“货架”。每个“货架”都有固定的格式,用来存放同一类物品。在数据库中,我们通过创建表来为数据定义精确的“模板”,规定每条数据应该长什么样。

一、理解表结构:一张表的构成要素

想象一下你要设计一个Excel表格来记录班级同学信息,你需要提前想好:

  1. 表头(列名):比如“学号”、“姓名”、“年龄”。

  2. 每列的数据类型:“学号”是数字,“姓名”是文本,“年龄”是数字。

  3. 约束规则:“学号”不能重复,“姓名”不能为空。

在MySQL中,创建表就是通过 CREATE TABLE 语句,将以上规划用SQL语言精确地描述出来。

二、CREATE TABLE 语句核心语法

创建表的基本语法结构如下:

CREATE TABLE [IF NOT EXISTS] 表名 (
    列1名 数据类型 [列约束],
    列2名 数据类型 [列约束],
    列3名 数据类型 [列约束],
    ...
    [表级约束]
) [表选项];

我们来分解一下这个“配方”中的关键部分:

部分

说明

示例

CREATE TABLE 表名

声明要创建一张新表。

CREATE TABLE students

[IF NOT EXISTS]

可选的安全开关。如果表已存在,不会报错。

CREATE TABLE IF NOT EXISTS students

( ... )

括号内是表的

列定义

,即“模板”的主体。


列名 数据类型

定义一列的名字和它能存什么数据。

student_id INT

[列约束]

对该列数据的额外规则(如不能为空、要唯一)。

NOT NULL

PRIMARY KEY

[表级约束]

涉及多列的规则(如复合主键、外键)。

PRIMARY KEY (col1, col2)

[表选项]

定义表的默认字符集、存储引擎等全局属性。

ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

三、从零开始:创建你的第一张表

让我们从最简单的表开始。假设我们要创建一个 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='学生基本信息表';

代码解析

  1. 主键student_id 是自增无符号整数主键。

  2. 业务唯一键student_number(学号)本身也具有 UNIQUE 和 NOT NULL 约束,保证了业务上的唯一性。

  3. 枚举类型gender 字段使用 ENUM,限定只能从三个选项中选一个。

  4. 默认值age 字段默认为18,gender 默认为'其他'。

  5. 自动时间戳

    • created_at 在记录插入时自动设置为当前时间。

    • updated_at 在记录插入或更新时,都会自动更新为当前时间。这是记录数据变更的利器。

  1. 注释:使用 COMMENT 为表和每个列添加说明,这对于文档和维护非常重要。

五、查看与确认

创建表后,你可以使用以下命令来验证表结构:

-- 查看当前数据库中的所有表
SHOW TABLES;

-- 查看 students 表的详细结构(字段、类型、约束等)
DESCRIBE students;
-- 或者使用缩写
DESC students;

-- 查看创建 students 表的完整SQL语句(非常有用)
SHOW CREATE TABLE students;

六、删除表(危险!慎用)

如果表设计有误或不再需要,可以删除。此操作不可逆,会永久删除表及其所有数据

-- 直接删除(危险)
DROP TABLE students;

-- 安全删除(如果存在才删除,推荐在脚本中使用)
DROP TABLE IF EXISTS students;


总结

实践

说明

示例

使用 IF NOT EXISTS

防止因表已存在导致脚本执行中断。

CREATE TABLE IF NOT EXISTS ...

选择合适的数据类型

在满足需求下选最小、最精确的类型。

年龄用 

TINYINT UNSIGNED

,而非 

INT

始终定义主键

为每张表设置一个主键,通常是自增ID。

id INT PRIMARY KEY AUTO_INCREMENT

善用 NOT NULL

明确哪些是必填字段,增强数据完整性。

name VARCHAR(100) NOT NULL

设置 DEFAULT 值

为可选字段提供合理的默认值。

status TINYINT DEFAULT 1

添加注释

用 

COMMENT

 说明表和列的用途。

COMMENT ‘用户账户表’

统一字符集

显式指定 

DEFAULT CHARSET=utf8mb4

避免中文乱码。

选择存储引擎

显式指定 

ENGINE=InnoDB

保证事务等高级特性支持。

命名规范建议

  • 表名和列名使用小写字母、数字和下划线的组合。

  • 表名使用复数名词(如 usersproducts),而关联表可用单数(如 user_profile)。

  • 主键列通常简称为 id,外键列通常为 关联表名_id(如 user_id)。


发表评论

昵称:
联系方式:
评论内容:

所有评论

关于我 备案号:蜀ICP备2023042032号-1