[数据库] MySQL基础(一):数据库、库表操作、数据类型与约束

111 0
Honkers 前天 07:28 | 显示全部楼层 |阅读模式

1. 数据库基础

1.1 什么是数据库

数据库(Database)就是按照一定的数据结构组织、存储和管理数据的仓库

那普通文件同样可以保存数据啊,为啥不用文件非得费个二遍事呢?

如果直接使用文件管理大量数据,会逐渐出现一些问题:

  • 安全性差:误操作后很难进行恢复。
  • 查询和管理不方便:文件中的数据没有按照合适的数据结构组织起来。
  • 控制不方便:各种数据管理逻辑都需要程序员自己实现。
  • 不适合管理海量数据:数据量越大,操作成本越高。

因此,我们需要数据库来统一完成数据的组织、存储和管理


1.2 常见数据库

目前常见的数据库有:

  • MySQL
  • Oracle
  • SQL Server
  • PostgreSQL
  • SQLite
  • Redis

其中按照数据主要存储的位置,又可以简单分为:

  1. 磁盘数据库:MySQL、Oracle、SQLite ...
  2. 内存数据库:Redis ...
复制代码

本文主要学习 MySQL


1.3 MySQL本质是一个网络服务

使用MySQL时,实际上存在两个角色:

  1. 客户端 服务端
  2. mysql ----------------> mysqld
  3. SQL语句
复制代码

我们平时在终端中使用的:

  1. mysql
复制代码

本质上是 MySQL客户端程序

而真正负责管理数据库的是:

  1. mysqld
复制代码

也就是MySQL服务器。

MySQL服务器本质上是一个网络服务,客户端通过网络连接服务器,然后将SQL语句发送给服务器执行。

MySQL默认端口号为:

  1. 3306
复制代码

因此整体关系可以理解为:

  1. Client
  2. |
  3. | SQL
  4. v
  5. MySQL Server
  6. |
  7. +-- database
  8. | |
  9. | +-- table
  10. | +-- table
  11. |
  12. +-- database
  13. |
  14. +-- table
复制代码


2. MySQL基本使用

2.1 启动、关闭和重启MySQL

在Ubuntu中可以通过 systemctl 管理MySQL服务:
启动MySQL:

  1. sudo systemctl start mysql
复制代码

关闭MySQL:

  1. sudo systemctl stop mysql
复制代码

重启MySQL:

  1. sudo systemctl restart mysql
复制代码

查看MySQL状态:

  1. sudo systemctl status mysql
复制代码

部分Linux发行版中服务名可能是 mysqld:

  1. systemctl start mysqld
  2. systemctl stop mysqld
  3. systemctl restart mysqld
复制代码

2.2 连接MySQL服务器

完整连接方式:

  1. mysql -h127.0.0.1 -P3306 -uroot -p
复制代码

其中:

  1. -h MySQL服务器IP
  2. -P MySQL服务器端口
  3. -u 用户名
  4. -p 输入用户密码
复制代码

如果连接的是本机MySQL,一般可以直接:

  1. mysql -uroot -p
复制代码

输入密码后即可进入MySQL。

退出MySQL:

  1. exit
复制代码

也可以使用:

  1. quit
复制代码

或者:

  1. \q
复制代码


3. 数据库、表、行和列

安装MySQL服务器,本质上就是安装了一个数据库管理系统

一个MySQL服务器可以管理多个数据库,一个数据库中又可以存在多张表:

  1. MySQL Server
  2. ├── database
  3. │ │
  4. │ ├── table
  5. │ └── table
  6. └── database
  7. └── table
复制代码

而表本身又由行和列组成。

例如:

idnamegender
1张三
2李四
3王五

其中:

  1. 列(column):表中的属性,例如 id、name、gender
  2. 行(row):一条完整的数据,也称为一条记录
复制代码

因此MySQL中的基本逻辑结构就是:

  1. MySQL服务器
  2. 数据库 database
  3. 表 table
  4. 行 row + 列 column
复制代码

有了这个基本认识,下面正式开始操作数据库。


4. 数据库的基本操作

数据库的基本操作可以按照CRUD的思路理解:

  1. Create 创建
  2. Retrieve 查看
  3. Update 修改
  4. Delete 删除
复制代码

4.1 增:创建数据库

创建数据库的基本语法:

  1. create database [if not exists] db_name[[default] charset=charset_name][[default] collate=collation_name];
复制代码

其中:

  1. [] 可选,不选则默认
  2. if not exists 数据库不存在时才创建
  3. charset 指定字符集
  4. collate 指定字符集对应的校验规则
复制代码

最简单的创建方式:

  1. create database helloworld;
复制代码


4.1.1 创建数据库本质上做了什么

先查看MySQL的数据存储目录:

  1. show variables like 'datadir';
复制代码

得到数据存储目录:

  1. /var/lib/mysql/
复制代码

在Linux中查看:

  1. sudo ls /var/lib/mysql/
复制代码

可以看到对应的:

  1. helloworld
复制代码

目录

也就是说:

创建数据库,本质上会在MySQL的数据存储目录下创建一个对应的数据库目录。

删除数据库后,这个目录也会随之消失。

关于db.opt文件

在MySQL 5.7等旧版本中,新建数据库后,数据库目录中通常存在一个:

  1. db.opt
复制代码

文件,其中记录该数据库默认使用的:

  1. 字符集
  2. 校验规则
复制代码

需要注意:MySQL 8.0已经取消了 db.opt 等文件式元数据,因此不同MySQL版本看到的目录内容可能不同。

重点理解:

  1. 数据库是逻辑概念
  2. 最终仍然需要落到磁盘进行存储
复制代码

4.1.2 字符集和校验规则

字符集决定:

数据应该使用什么编码方式进行存储。

校验规则决定:

字符串应该按照什么规则进行比较。

创建数据库时指定字符集:

  1. create database db1 charset=utf8mb4;
复制代码

同时指定校验规则:

  1. create database db2 charset=utf8mb4 collate=utf8mb4_general_ci;
复制代码

如果创建数据库时没有显式指定,则使用MySQL的默认配置。

查看数据库默认字符集:

  1. show variables like 'character_set_database';
复制代码

查看数据库默认校验规则:

  1. show variables like 'collation_database';
复制代码

查看MySQL支持的字符集:

  1. show charset;
复制代码

查看支持的校验规则:

  1. show collation;
复制代码

不同的校验规则会直接影响字符串比较。

例如:

  1. _ci 一般表示大小写不敏感
  2. _bin 按二进制方式比较,通常区分大小写
复制代码

因此同样查询:

  1. select * from person where name='alice';
复制代码

在不同校验规则下,得到的结果可能不同。


4.2 查:查看数据库

查看当前MySQL服务器中的所有数据库:

  1. show databases;
复制代码

查看数据库的创建语句:

  1. show create database helloworld;
复制代码


4.2.1 使用数据库

进入指定数据库:

  1. use helloworld;
复制代码

可以将它简单理解成:

  1. Linux:cd进入目录
  2. MySQL:use进入数据库
复制代码

查看当前正在使用哪个数据库:

  1. select database();
复制代码


4.2.2 查看MySQL连接

查看当前MySQL连接情况:

  1. show processlist;
复制代码

如果希望查看完整SQL:

  1. show full processlist;
复制代码

其中常见字段:

  1. Id 当前连接的编号
  2. User 用户
  3. Host 客户端来源
  4. db 当前使用的数据库
  5. Command 当前状态
  6. Time 状态持续时间
  7. Info 当前执行的SQL
复制代码

如果需要终止某个连接:

  1. kill id;
复制代码

4.3 改:修改数据库

数据库的修改主要是修改:

  1. 字符集
  2. 校验规则
复制代码

基本语法:

  1. alter database db_name [[default] charset=charset_name] [[default] collate=collation_name];
复制代码

例如:

  1. alter database helloworld charset=utf8mb4 collate=utf8mb4_general_ci;
复制代码

修改后可以再次查看:

  1. show create database helloworld;
复制代码


4.4 删:删除数据库

基本语法:

  1. drop database [if exists] db_name;
复制代码

例如:

  1. drop database helloworld;
复制代码

为了避免数据库不存在时报错:

  1. drop database if exists helloworld;
复制代码

数据库删除以后:

  1. 数据库目录被删除
  2. 数据库中的表也全部被删除
  3. 表中的数据自然也全部消失
复制代码

因此 drop database 是一个非常危险的操作。


5. 表的基本操作

数据库创建完成以后,真正的数据最终需要放到中。

表结构相关操作属于:

  1. DDL:Data Definition Language
复制代码

也就是数据定义语言。

这里同样按照:

  1. 增 → 查 → 改 → 删
复制代码

的顺序进行。


5.1 增:创建表

创建表之前首先需要进入一个数据库:

  1. use helloworld;
复制代码

创建表的基本语法:

  1. create table [if not exists] table_name(
  2. field1 datatype1 [comment '描述'],
  3. field2 datatype2 [comment '描述'],
  4. field3 datatype3 [comment '描述']
  5. )[charset=charset_name] [collate=collation_name] [engine=engine_name];
复制代码

其中:

  1. field 列名
  2. datatype 数据类型
  3. charset 表的字符集
  4. collate 表的校验规则
  5. engine 存储引擎
  6. comment 字段说明
复制代码

例如:

  1. create table stu(
  2. id int,
  3. name varchar(30),
  4. gender varchar(2)
  5. );
复制代码


5.1.1 存储引擎

查看MySQL支持的存储引擎:

  1. show engines;
复制代码

目前最常用的存储引擎是:

  1. InnoDB
复制代码

创建表时也可以显式指定:

  1. create table stu(
  2. id int,
  3. name varchar(30)
  4. ) engine=InnoDB;
复制代码

如果不指定,则使用MySQL默认存储引擎。


5.1.2 创建表本质上做了什么

创建表以后,可以再次查看数据库对应的物理目录:

  1. sudo ls /var/lib/mysql/helloworld/
复制代码

表是逻辑结构,但最终依然需要由存储引擎将其数据落到磁盘。

旧版MySQL中:

  1. InnoDB:
  2. stu.frm 表结构
  3. stu.ibd 表数据和索引
复制代码

而MySQL 8.0已经取消 .frm 文件,将表结构等元数据统一放入数据字典(.ibd)。

因此实际截图时以当前MySQL版本为准。


5.2 查:查看表

查看当前数据库中的所有表:

  1. show tables;
复制代码

查看表结构:

  1. desc stu;
复制代码

也可以写成:

  1. describe stu;
复制代码

常见字段:

  1. Field 字段名
  2. Type 数据类型
  3. Null 是否允许NULL
  4. Key 是否为索引字段
  5. Default 默认值
  6. Extra 额外属性
复制代码

查看完整建表语句:

  1. show create table student;
复制代码


5.3 改:修改表

修改表结构统一使用:

  1. alter table
复制代码

新增字段

  1. alter table stu add age tinyint unsigned;
复制代码

如果希望添加到某个字段后面:

  1. alter table stu add age tinyint unsigned after name;
复制代码

添加到第一列:

  1. alter table stu add id int first;
复制代码

修改字段属性

  1. alter table stu modify name varchar(50);
复制代码

modify 修改的是字段属性,不改变字段名。


修改字段名

  1. alter table stu change name student_name varchar(50);
复制代码

change 可以同时修改:

  1. 字段名
  2. 字段属性
复制代码

删除字段

  1. alter table stu drop age;
复制代码

删除字段以后,该字段原有的数据也会一起消失。


修改表名

  1. alter table stu rename to student;
复制代码


5.4 删:删除表

基本语法:

  1. drop table [if exists] table_name;
复制代码

例如:

  1. drop table student;
复制代码

删除表意味着:

  1. 表结构消失
  2. +
  3. 表中的数据全部消失
复制代码


6. 数据库和表的备份与恢复

前面已经把库和表的基本操作介绍完毕,下面再来看数据的备份和恢复。

MySQL的逻辑备份,本质上可以简单理解为:

把创建数据库、创建表、插入数据等SQL语句保存到一个SQL文件中。

恢复时再把这些SQL重新执行一遍。


6.1 数据库备份

数据库备份使用:

  1. mysqldump -h127.0.0.1 -P3306 -uroot -p -B 数据库名 > 备份文件.sql
复制代码

例如:

  1. mysqldump -h127.0.0.1 -P3306 -uroot -p -B helloworld > helloworld.sql
复制代码

注意:

mysqldump 是Linux命令,需要在普通终端中执行,而不是在 mysql> 中执行。

查看生成的SQL文件:

  1. less helloworld.sql
复制代码

可以发现其中保存的实际上就是大量SQL语句。


6.2 数据库恢复

进入MySQL:

  1. mysql -uroot -p
复制代码

然后执行:

  1. source /完整路径/helloworld.sql;
复制代码

MySQL会按照顺序重新执行备份文件中的SQL,数据库、表以及表中的数据就会被恢复出来。



6.3 表备份

如果不希望备份整个数据库,只想备份其中几张表:

  1. mysqldump -h127.0.0.1 -P3306 -uroot -p 数据库名 表1 表2 > 备份文件.sql
复制代码

例如:

  1. mysqldump -h127.0.0.1 -P3306 -uroot -p helloworld student > table.sql
复制代码


6.4 表恢复

表备份文件中通常没有:

  1. create database
  2. use database
复制代码

因此恢复表之前,需要先准备一个数据库:

  1. create database restore_test;
  2. use restore_test;
复制代码

再执行:

  1. source /完整路径/table.sql;
复制代码

恢复完成后:

  1. show tables;
复制代码

即可看到恢复出来的表。



7. MySQL数据类型

表由一个个字段组成,而每个字段都必须具有自己的数据类型。

数据类型主要决定三件事:

  1. 数据应该占用多少空间
  2. 数据应该如何解释
  3. 数据允许取什么值
复制代码

MySQL常见数据类型可以分为:

分类常见类型
整数tinyint、smallint、int、bigint
小数float、double、decimal
bit
字符串char、varchar
日期时间date、datetime、timestamp
特殊字符串enum、set

7.1 BOOL

MySQL中的:

  1. bool
复制代码

实际上是:

  1. tinyint(1)
复制代码

的同义写法。

例如:

  1. create table test_bool(
  2. flag bool
  3. );
复制代码

查看:

  1. desc test_bool;
复制代码

可以看到实际类型会表现为 tinyint。

在布尔语义中:

  1. 0 false
  2. 非0 true
复制代码

需要注意,tinyint(1) 并不会真的把数据限制成只能存 0 和 1。


7.2 TINYINT

tinyint 占用1字节。

有符号范围:

  1. -128 ~ 127
复制代码

无符号范围:

  1. 0 ~ 255
复制代码

例如:

  1. create table test(
  2. num tinyint
  3. );
复制代码

插入:

  1. insert into test values(127);
复制代码

可以成功。

继续插入:

  1. insert into test values(128);
复制代码

将会超出取值范围。

无符号:

  1. create table test_unsigned
  2. (
  3. num tinyint unsigned
  4. );
复制代码

此时范围变成:

  1. 0 ~ 255
复制代码

数据类型本身其实就已经是一种约束:

  1. tinyint规定了数据必须是整数
  2. 同时规定了整数的取值范围
复制代码

这也是后面表约束的基础。


7.3 BIT

bit 用于保存位数据:

  1. bit(M)
复制代码

其中:

  1. M表示位数
  2. 范围为1~64
复制代码

例如:

  1. create table test_bit(
  2. num bit(8)
  3. );
复制代码

底层保存的是二进制位,因此直接查询时显示结果有时并不直观。

可以配合:

  1. select num + 0 from test_bit;
复制代码

将其按照数字查看。


7.4 FLOAT和DOUBLE

float 用于保存单精度浮点数:

  1. float
复制代码

double 用于保存双精度浮点数:

  1. double
复制代码

浮点数最大的问题是:

存在精度损失。

因此如果只是普通小数,可以使用 float / double。

如果要求数据绝对精确,例如:

  1. 金额
  2. 财务数据
复制代码

则更适合使用 decimal。


7.5 DECIMAL

decimal 是定点数:

  1. decimal(M, D)
复制代码

其中:

  1. M 总位数
  2. D 小数位数
复制代码

例如:

  1. price decimal(8, 2);
复制代码

表示:

  1. 总共最多8位
  2. 其中2位为小数
复制代码

decimal 相比 float 最大的特点就是能够避免常见的浮点精度损失。

  1. 精度要求不高 float / double
  2. 精度要求很高 decimal
复制代码

精度比较如下:


8. 字符串类型

8.1 CHAR

char 是定长字符串:

  1. char(N)
复制代码

例如:

  1. gender char(1);
复制代码

所谓定长,就是字段定义以后,其最大字符长度是固定的。

适合长度比较稳定的数据。


8.2 VARCHAR

varchar 是变长字符串:

  1. varchar(N)
复制代码

例如:

  1. name varchar(30);
复制代码

它会根据实际保存的数据长度使用空间,因此更适合长度变化较大的字符串。


8.3 CHAR和VARCHAR

简单来说:

  1. char 定长
  2. varchar 变长
复制代码

如果数据长度基本固定:

  1. char更合适
复制代码

如果数据长度变化很大:

  1. varchar更合适
复制代码

例如:

  1. 性别、固定编号 char
  2. 姓名、地址、标题 varchar
复制代码

9. 日期时间类型

9.1 DATE

date 用于保存日期:

  1. YYYY-MM-DD
复制代码

例如:

  1. birthday date;
复制代码

数据:

  1. 2026-09-06
复制代码

9.2 DATETIME

datetime 保存日期和时间:

  1. YYYY-MM-DD HH:MM:SS
复制代码

例如:

  1. create_time datetime;
复制代码

数据:

  1. 2026-09-06 10:30:00
复制代码

9.3 TIMESTAMP

timestamp 时间戳同样可以记录时间。

例如:

  1. create_time timestamp;
复制代码

通常用于:

  1. 创建时间
  2. 更新时间
复制代码

等时间信息。
无需插入,自动获取


10. ENUM和SET

10.1 ENUM

enum 是枚举类型:

只能从提前给定的多个值中选择一个。

例如:

  1. gender enum('男', '女');
复制代码

此时:

  1. 男 可以
  2. 女 可以
  3. 其他 不符合枚举定义
复制代码

因此 enum 可以理解为:

  1. 单选
复制代码

10.2 SET

set 同样需要提前给出允许的取值:

  1. hobby set('篮球', '足球', '音乐', '电影');
复制代码

但与 enum 不同:

  1. enum 只能选择一个
  2. set 可以选择多个
复制代码

例如:

  1. insert into student values('张三', '篮球,音乐');
复制代码

11. 表的约束

前面学习的数据类型,本身已经能够对数据进行一定的约束。

例如:

  1. age tinyint unsigned
复制代码

就已经规定:

  1. 必须是整数
  2. 不能是负数
  3. 还不能超过tinyint unsigned的范围
复制代码

但是数据类型提供的约束仍然比较单一。

实际业务中还会出现:

  1. 姓名不能为空
  2. 学号不能重复
  3. 年龄不给时使用默认值
  4. id自动增长
  5. 学生必须属于一个真实存在的班级
复制代码

因此MySQL还提供了各种额外的表约束。

主要包括:

  1. null / not null
  2. default
  3. comment
  4. zerofill
  5. primary key
  6. auto_increment
  7. unique
  8. foreign key
复制代码

11.1 NULL和NOT NULL

MySQL中的字段默认通常允许为:

  1. NULL
复制代码

NULL 表示:

当前这个值未知或者不存在。

例如:

  1. select null;
复制代码

并且:

  1. select null + 1;
复制代码

结果仍然是:

  1. NULL
复制代码

因为一个未知的值参与运算以后,结果仍然无法确定。//这块是个坑,下篇解决它

如果一个字段不允许为空,可以使用:

  1. not null
复制代码

例如:

  1. create table student(
  2. name varchar(30) not null
  3. );
复制代码

此时插入数据时必须提供 name。


11.2 DEFAULT

如果某个字段经常使用同一个值,可以给它设置默认值:

  1. default
复制代码

例如:

  1. create table student
  2. (
  3. name varchar(30),
  4. age tinyint unsigned default 18
  5. );
复制代码

插入:

  1. insert into student(name) values('张三');
复制代码

由于没有给 age,MySQL会使用:

  1. 18
复制代码

作为默认值。

需要注意:

  1. default 解决“不提供值时用什么”
  2. not null 解决“能不能显式出现NULL”
复制代码

二者不是一回事。


11.3 COMMENT

comment 用于给字段添加说明:

  1. create table student
  2. (
  3. id int comment '学号',
  4. name varchar(30) comment '姓名'
  5. );
复制代码

查看:

  1. show create table student;
复制代码

即可看到这些字段描述。

comment 本质上类似代码中的注释,主要方便:

  1. 程序员
  2. DBA
  3. 维护人员
复制代码

理解表结构。


11.4 ZEROFILL

zerofill 用于在数值显示宽度不足时,在前面补 0。

例如旧版MySQL中:

  1. create table test
  2. (
  3. num int(5) zerofill
  4. );
复制代码

插入:

  1. insert into test values(12);
复制代码

显示:

  1. 00012
复制代码

但底层保存的数据仍然是:

  1. 12
复制代码

也就是说:

zerofill主要改变显示效果,并没有改变真实数值。

该特性在新版MySQL中已经逐渐废弃,实际开发了解即可。


11.5 PRIMARY KEY

主键:

  1. primary key
复制代码

用于唯一标识表中的一条记录

例如:

  1. create table student
  2. (
  3. id int unsigned primary key,
  4. name varchar(30)
  5. );
复制代码

主键具有两个最基本的要求:

  1. 不能重复
  2. 不能为空
复制代码

因此:

  1. id = 1
  2. id = 2
  3. id = 3
复制代码

都可以。

但再次插入:

  1. id = 1
复制代码

就会产生主键冲突。

一张表只能有一个主键。


添加和删除主键

已经存在的表也可以添加主键:

  1. alter table student add primary key(id);
复制代码

删除主键:

  1. alter table student drop primary key;
复制代码


复合主键

一张表只能有一个主键,但:

一个主键可以由多个字段共同组成。

例如一个网络进程可以由:

  1. IP + PORT
复制代码

共同唯一确定。

  1. create table process
  2. (
  3. ip varchar(30),
  4. port int unsigned,
  5. info varchar(100),
  6. primary key(ip, port)
  7. );
复制代码

此时:

  1. ip可以重复
  2. port也可以重复
  3. 但(ip, port)不能同时重复
复制代码

例如:

  1. 192.168.1.1 8080
  2. 192.168.1.1 8081
  3. 192.168.1.2 8080
复制代码

都没有问题。

但:

  1. 192.168.1.1 8080
  2. 192.168.1.1 8080
复制代码

会发生主键冲突。


11.6 AUTO_INCREMENT

auto_increment 表示字段自动增长。

例如:

  1. create table student
  2. (
  3. id int unsigned primary key auto_increment,
  4. name varchar(30)
  5. );
复制代码

插入数据时不提供 id:

  1. insert into student(name) values('张三');
  2. insert into student(name) values('李四');
  3. insert into student(name) values('王五');
复制代码

MySQL会自动得到:

  1. 1 张三
  2. 2 李四
  3. 3 王五
复制代码

自增长字段通常需要满足:

  1. 必须是数值类型
  2. 必须是一个Key(不止主键,后面详谈)
  3. 一张表只能有一个auto_increment字段
复制代码

最常见的组合就是:

  1. id int primary key auto_increment
复制代码

11.7 UNIQUE

唯一键:

  1. unique
复制代码

用于保证某个字段的数据不能重复。

例如:

  1. create table teacher
  2. (
  3. id int unsigned primary key auto_increment,
  4. sn int unsigned unique,
  5. name varchar(30)
  6. );
复制代码

这里:

  1. id 使用主键保证唯一
  2. sn 使用unique保证唯一
复制代码

主键和唯一键的区别可以简单理解为:

  1. primary key
  2. 唯一
  3. 非空
  4. 一张表只有一个
  5. unique
  6. 唯一
  7. 一张表可以存在多个
复制代码


11.8 FOREIGN KEY

外键用于建立两张表之间的约束关系

例如现在有:

  1. 班级表
  2. 学生表
复制代码

一个学生所属的班级,应该是真实存在的班级。

先创建班级表:

  1. create table class_table
  2. (
  3. class_id int primary key,
  4. class_name varchar(30)
  5. );
复制代码

再创建学生表:

  1. create table student
  2. (
  3. id int primary key,
  4. name varchar(30),
  5. class_id int,
  6. foreign key(class_id) references class_table(class_id)
  7. );
复制代码

其中:

  1. foreign key(class_id) references class_table(class_id)
复制代码

表示:

  1. student.class_id
  2. |
  3. | 引用
  4. v
  5. class_table.class_id
复制代码

关系可以表示为:

  1. class_table
  2. ----------------------
  3. class_id class_name
  4. 1 一班
  5. 2 二班
  6. 3 三班
  7. ^
  8. |
  9. | foreign key
  10. |
  11. student
  12. ----------------------
  13. id name class_id
  14. 1 张三 1
  15. 2 李四 2
  16. 3 王五 1
复制代码

如果班级表中不存在:

  1. class_id = 10
复制代码

那么学生表就不能随意插入一个属于10班的学生。

这就是外键约束:

保证两张存在关联关系的表,其数据关系也是合法的。


没有99班被阻止

删除有学生的班级被阻止


12. 小结

到这里,MySQL最基础的一条主线就已经建立起来了:

  1. MySQL服务器
  2. 数据库
  3. 字段
  4. 数据类型
  5. 表约束
复制代码

这一篇主要解决的是:

  1. 数据放在哪里
  2. 表应该怎么建立
  3. 字段应该存什么
  4. 字段应该遵守什么规则
复制代码

下一篇正式开始操作表中的数据

也就是:

  1. Create 新增
  2. Retrieve 查询
  3. Update 修改
  4. Delete 删除
复制代码

简称:

  1. CRUD
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行