Mysql 08: 数据表基本操作——从创建到约束

MySQL 数据表基本操作全解:从创建到约束,一文吃透

在 MySQL 中,数据表的基本操作是数据库开发的基石,涵盖表的创建、约束设计、结构查看等核心内容。本文围绕图片中的知识点,从语法、代码示例、场景说明三个维度,带你彻底掌握 MySQL 表操作。


一、核心知识点总览

大类 细分知识点 核心作用
1. 创建数据表 1) 创建表语法 定义表结构、字段、数据类型
2) 主键约束 唯一标识表中每一行数据
- 单字段主键 单个字段作为主键
- 多字段联合主键 多个字段组合作为主键
3) 外键约束 建立表与表之间的关联关系
4) 非空约束 强制字段不能为 NULL
5) 唯一性约束 保证字段值不重复
6) 默认约束 给字段设置默认值
7) 自动增加 主键字段自动递增
2. 查看数据表结构 1) DESCRIBE 语句 快速查看表字段、类型、约束
2) SHOW CREATE TABLE 语句 查看表的完整创建语句

二、1. 创建数据表

1.1 创建表的语法形式

基础语法
sql 复制代码
CREATE TABLE [IF NOT EXISTS] 表名 (
    字段1 数据类型 [约束条件],
    字段2 数据类型 [约束条件],
    ...
    [表级约束]
) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集];
  • IF NOT EXISTS:表不存在时才创建,避免报错
  • ENGINE:常用 InnoDB(支持事务、外键)
  • CHARSET:常用 utf8mb4(支持 emoji 等全字符)

1.2 使用主键约束

主键(PRIMARY KEY)是表的唯一标识 ,要求:非空、唯一、一个表只能有一个主键

(1) 单字段主键
语法(两种写法)
sql 复制代码
-- 方式1:字段级定义(推荐)
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT, -- 单字段主键
    stu_name VARCHAR(20) NOT NULL,
    age INT
);

-- 方式2:表级定义
CREATE TABLE student (
    stu_id INT,
    stu_name VARCHAR(20) NOT NULL,
    age INT,
    PRIMARY KEY (stu_id) -- 表级定义主键
);
(2) 多字段联合主键

多个字段组合作为主键,要求组合值唯一,常用于中间表、关联表。

sql 复制代码
-- 学生课程中间表:stu_id + course_id 联合主键
CREATE TABLE student_course (
    stu_id INT,
    course_id INT,
    score INT,
    PRIMARY KEY (stu_id, course_id) -- 联合主键
);

说明:单个 stu_id 可重复,单个 course_id 可重复,但 (stu_id, course_id) 组合必须唯一。


1.3 使用外键约束

外键(FOREIGN KEY)用于建立表与表的关联,保证数据的参照完整性。

要求:外键字段必须引用另一张表的主键 / 唯一键,且数据类型一致。

代码示例
sql 复制代码
-- 1. 先创建父表(班级表)
CREATE TABLE class (
    class_id INT PRIMARY KEY AUTO_INCREMENT,
    class_name VARCHAR(20) NOT NULL
);

-- 2. 创建子表(学生表),添加外键关联班级表
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_name VARCHAR(20) NOT NULL,
    class_id INT,
    -- 表级定义外键
    FOREIGN KEY (class_id) REFERENCES class(class_id)
        ON DELETE CASCADE -- 父表删除,子表同步删除
        ON UPDATE CASCADE -- 父表更新,子表同步更新
);

常用级联操作:CASCADE(同步)、SET NULL(设为 NULL)、RESTRICT(限制删除)


1.4 使用非空约束

非空约束(NOT NULL):强制字段不能为 NULL,插入时必须赋值。

sql 复制代码
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_name VARCHAR(20) NOT NULL, -- 非空约束:姓名不能为空
    age INT
);

说明:插入数据时,若 stu_name 为 NULL,MySQL 直接报错。


1.5 使用唯一性约束

唯一性约束(UNIQUE):保证字段值不重复,允许 NULL(但最多一个 NULL)。

sql 复制代码
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_name VARCHAR(20) NOT NULL,
    phone VARCHAR(11) UNIQUE -- 唯一性约束:手机号不能重复
);

区别:主键 = 非空 + 唯一;唯一约束 = 唯一 + 允许 NULL(一个)


1.6 使用默认约束

默认约束(DEFAULT):给字段设置默认值,插入时不赋值则自动填充。

sql 复制代码
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_name VARCHAR(20) NOT NULL,
    age INT DEFAULT 18, -- 默认约束:默认年龄18
    gender VARCHAR(5) DEFAULT '男'
);

示例:插入 INSERT INTO student(stu_name) VALUES ('张三');age 自动为 18,gender 自动为


1.7 设置表的属性值自动增加

自动增加(AUTO_INCREMENT):仅用于整数类型的主键,插入时自动递增,无需手动赋值。

sql 复制代码
CREATE TABLE student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT, -- 自动递增
    stu_name VARCHAR(20) NOT NULL
);

说明:插入 INSERT INTO student(stu_name) VALUES ('张三'),('李四');stu_id 自动为 1、2。


三、2. 查看数据表结构

2.1 查看表基本结构:DESCRIBE / DESC

快速查看表的字段、数据类型、是否为空、主键、默认值等信息。

语法
sql 复制代码
DESCRIBE 表名;
-- 简写
DESC 表名;
代码示例
sql 复制代码
DESC student;
运行结果

表格

Field Type Null Key Default Extra
stu_id int NO PRI NULL auto_increment
stu_name varchar(20) NO NULL
age int YES 18
gender varchar(5) YES

字段说明:

  • KeyPRI= 主键,UNI= 唯一键,MUL= 普通索引 / 外键
  • Extraauto_increment= 自动递增

2.2 查看表详细结构:SHOW CREATE TABLE

查看表的完整创建语句,包含所有约束、存储引擎、字符集等。

语法
sql 复制代码
SHOW CREATE TABLE 表名;
代码示例
sql 复制代码
SHOW CREATE TABLE student;
运行示例
sql 复制代码
CREATE TABLE `student` (
  `stu_id` int NOT NULL AUTO_INCREMENT,
  `stu_name` varchar(20) NOT NULL,
  `age` int DEFAULT '18',
  `gender` varchar(5) DEFAULT '男',
  PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

说明:完整还原表的创建语句,可用于备份、迁移表结构。


四、综合实战:完整表创建示例

sql 复制代码
-- 1. 创建班级表(父表)
CREATE TABLE IF NOT EXISTS class (
    class_id INT PRIMARY KEY AUTO_INCREMENT,
    class_name VARCHAR(20) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 2. 创建学生表(子表,含所有约束)
CREATE TABLE IF NOT EXISTS student (
    stu_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_name VARCHAR(20) NOT NULL,
    phone VARCHAR(11) UNIQUE,
    age INT DEFAULT 18,
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES class(class_id)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 3. 查看表结构
DESC student;
SHOW CREATE TABLE student;

五、核心注意事项(避坑指南)

  1. 主键规则:一个表只能有一个主键,主键必须非空、唯一
  2. 外键要求:外键必须引用父表的主键 / 唯一键,数据类型必须一致
  3. AUTO_INCREMENT:仅用于整数主键,一个表只能有一个自增字段
  4. 唯一约束 vs 主键:唯一约束允许 NULL,主键不允许
  5. 默认约束:默认值必须与字段数据类型一致
  6. 存储引擎 :外键仅支持 InnoDBMyISAM 不支持外键

六、核心总结

  1. 创建表核心CREATE TABLE + 字段定义 + 约束设计
  2. 五大核心约束
    • 主键(PRIMARY KEY):唯一标识
    • 外键(FOREIGN KEY):表间关联
    • 非空(NOT NULL):强制赋值
    • 唯一(UNIQUE):值不重复
    • 默认(DEFAULT):自动填充
  3. 查看表结构DESC 快速看字段,SHOW CREATE TABLE 看完整语句
  4. 自增(AUTO_INCREMENT):主键自动递增,简化插入
相关推荐
程序员小郭832 小时前
MySQL分库分表策略全解析(实战版)
数据库·mysql·架构
卓怡学长2 小时前
m320基于Java的网络音乐系统的设计与实现
java·数据库·spring·tomcat·maven
總鑽風2 小时前
数据一致性springcloud+rabbitmq+mysql+redis
mysql·spring cloud·rabbitmq
爱浦路 IPLOOK3 小时前
选对UPF网元供应商,解锁5G-A时代行业赋能新可能
运维·网络·数据库
墨神谕3 小时前
什么是回表查询
mysql
Elastic 中国社区官方博客3 小时前
将 Logstash 管道从 Azure Event Hubs 迁移到 Kafka 输入插件
大数据·数据库·elasticsearch·microsoft·搜索引擎·kafka·azure
草莓熊Lotso3 小时前
MySQL 事务管理全解:从 ACID 特性、隔离级别到 MVCC 底层原理
linux·运维·服务器·c语言·数据库·c++·mysql
鸽芷咕3 小时前
Oracle 替代工程实践深度解析:金仓全链路工程实践 —— 从评估决策到平滑上线的深度技术攻坚
数据库·oracle
gushinghsjj3 小时前
元数据管理包含哪些?元数据管理如何支持数据分析?
数据库·oracle·数据分析