Mysql中设计数据表的过程解析

2025-07-28 20:50

本文主要是介绍Mysql中设计数据表的过程解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My...

1.引言

数据库约束是确保数据完整性的关键机制,通过预定义的规则自动校验数据,避免人工检查的繁琐和潜在错误。约束作用于表的列上,确保数据的正确性和关联关系的有效性。以下是常见约束类型的详细说明及示例。

2.NOT NULL——制定某列不可以存储NULL值

用于禁止某列存储空值(NULL),强制字段为必填项。

先来看看不加约php束的学生表格所展示出来的信息:

desc student;

Mysql中设计数据表的过程解析

当没有指定非空约束的时候,当前的列表示是可以写入一个NULL的值的,如果要把某一列定义为一个必填项,那么就可以使用not null来进行约束。示例如下:

CREATE TABLE student(
    id BIGINT not NULL,
    name VARCHAR(50)
);

Mysql中设计数据表的过程解析

 如图所示这个NO就表示当前列(id列)不能为空 

下面我们插入一条为空的id数据试试:

INSERT into student VALUES(NULL,'张三');

Mysql中设计数据表的过程解析

 写入这条数据的时候会报错,提示不可写入null的数值,这里数据库就帮我们进行了一次校验。

INSERT INTO student VALUES(1,'张三');

当我们写入一条id列不为空的数据的时候,就可以正常写入这条数据

2.UNIQUE——保证某一列的每一行必须有唯一的数值

确保某列的数值在表中唯一,适用于如学号、身份证号等场景。
我们首先来看一下不加唯一约束的时候的情况:

Mysql中设计数据表的过程解析

可见这出现了编号相同但是人名不一致的情况,这种情况不符合逻辑。如何解决这一问题呢?
UNIQUE这一约束条件就应运而生了
下面我们来看一下如何创建一个在id字段加唯一约束的表:

CREATE TABLE student(
    id BIGINT UNIQUE,
    name VARCHAR(50)
);

Mysql中设计数据表的过程解析

 由上图可见id的Key有一个UNI的标识,这就表示唯一约束
这时如果我们再插入两个一样的id数据就会报错,错误信息如下:

Mysql中设计数据表的过程解析

 需要注意的是NULL可以重复插入,并不会报错

3. DEFAULT——规定没有给列赋值时的默认值

用于为列指定默认值,当插入数据未显式赋值时自动填充。

INSERT INTO student (id) VALUES(2);

Mysql中设计数据表的过程解析

如果我们不指定name的默认值就会出现这样的情况,显然这种情况也是不合理的
下面我们就来创建一个给name列设置默认值的一个数据表

CREATE TABLE student(
  id BIGINT UNIQUE,
  NAME VARCHAR(50) DEFAULT '无名氏'
);

Mysql中设计数据表的过程解析

这个Default无名氏就是我们指定的默认值
Null列表示当前列是否可以为空
Key表示数据行的键值(标识)
Extra标识扩展信息 javascript;

下面我们来演示一下只指定了id会出现什么情况:

INSERT INTO student (id) VALUES(2);

Mysql中设计数据表的过程解析

由此可见这时的name就用默认值进行填充了
下面我们来思考这样一个问题:如果我们给name列设置为NULL会出现什么情况呢?

INSERT INTO student VALUES(3,NULL);

Mysql中设计数据表的过程解析

 由此可见,虽然我们已经指定了默认约束,但是当我们手动指定这一列的值为NULL的时候,插入的值依旧是NULL,因为这个NULLL是我们自己手动指定的,也可以理解为:用户指定的优先级要高于默认约束。
于是我们可以得到这样一个结论:
当我们为某一列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束。

4.PRIMARY KEY ——NOT NULL和UNIQUE的结合

确保某列(或者两个列多个列的结合)有唯一标识,有助于更容易快速找到表中的一个特定记录。

主键是 NOT NULL 和 UNIQUE的结合,用于唯一标识记录。

下面我们首先来演示一下如何把某一列的值约束为非空且唯一的:

CREATE TABLE student(
-- 下面这个就把id设置为了 不为空 并且唯一 注意: not null 和unique之间不能有, 直接空格就行
  id BIGINT not NULL UNIQUE,
  sn int UNIQUE,
  name VARCHAR(50) DEFAULT '无名氏'
);

Mysql中设计数据表的过程解析

由上图可见这个id的Key列中被标识为了一个PRI,表示他是一个主键
我们在写入数据的时候这两个约束是同时生效的:

Mysql中设计数据表的过程解析

Mysql中设计数据表的过程解析

CREATE TABLE student(
    id BIGINT PRIMARY KEY  AUTO_INCREMENT,
    sn int UNIQUE,
    name VARCHAR(20) DEFAULT '无名氏'
);

Mysql中设计数据表的过程解析

这个id列的Extro的AUTO_INCREMENT表示自增类型,意为在当前表中上一条记录的基本上+1即可
这样设计的好处在于:让数据库去帮助我们维护主键的增长,不用自己去计算了,在插入数值的时候先找到最大的值,然后在这个基础上+1生成一个新的值,从而作为一个数据行主键(也就是id列)的值。

4.1全列插入演示

在写入数据的时候,我们不具体指定主键列的值,而是用NULL代替

INSERT INTO student VALUES(null,1001,'张三');
INSERT INTO student VALUES(null,1002,'李四');
SELECT* FROM student;

Mysql中设计数据表的过程解析

由此可见:

当设置了自增主键之后,写入null的时候,也可以成功插入数据。这里并不是说把这个null写入数据库了,而是说数据库帮我们去处理这个列中的数值(进行自增操作

4.2指定列插入演示

INSERT INTO student(sn,name) VALUES(1003,'王五'),(1004,'赵六');
SELECT* FROM student;

Mysql中设计数据表的过程解析

由此可见当我们进行指定列插入的时候,也会自动生成id,作为该数据行的主键 。

下面我们思考这样一个问题:我们可不可以指定一个主键值呢?
时间是检验真理的唯一标准,接下来我们就手动指定来看看吧~

INSERT INTO student VALUES(100,1010,'钱七');
SELECT* FROM student;

Mysql中设计数据表的过程解析

由此可见这个操作是可以的,只要主键值不重复即可 

我们在这个基础之上再插入一条不指定id的数据试试,在这之前我们可以思考一下 这条新数据的id数值是多少呢?

INSERT INTO student(sn,name) VALUES(1011,'王二');

Mysql中设计数据表的过程解析

由此可见这个id的值是在原先数据表中id的最大值的基础上加1,由此可见主键在数据表中有可能不是连续的

4.3一个表中不允许有两个主键

CREATE TABLE test111(
  id BIGINT PRIMARY KEY,
  sn BIGINT PRIMARY KEY
);

Mysql中设计数据表的过程解析

由上可见一个表中不可以同时设置两个主键,这样会报错。
但是一个主键可以同时包含多个列(复合主键)
下面我们就来演示一下复合主键:

CREATE TABLE stu1(
  id BIGINT,
  NAME VARCHAR(20),
  mail VARCHAR(50),
  PRIMARY KEY (id,name)
);
DESC stu1;

Mysql中设计数据表的过程解析

由上图可知 id 和name的Key都有PRI 这就表示当前的表定义了复合主键,
复合主键在进行唯一校验的时候,只有复合主键中所有的列都相同才被判定为相同
下面我们通过例子来证实这一说法:

INSERT INTO stu1 VALUES(1,'张三','zs.com');
SELECT* FROM stu1;

Mysql中设计数据表的过程解析

下面我们再写入一条和这个一样的数据,看看会发生什么现象: 

INSERT INTO stu1 values(1,'张三','zs.com');

Mysql中设计数据表的过程解析

报错了,那就证明这条数据是不可以pOfadpvCg写入的,因为他和前面一条数据完全一致。

下面我们尝试一下id一样,name不一样是否可以成功写入呢?

INSERT INTO stu1 VALUES(1,'李四','ls.com');
SELECT* FROM stu1;

Mysql中设计数据表的过程解析

由此可见这条数据虽然id和前面张三的id一样,但是姓名不同,因此这条数据是可以插入成功的 

5.FOREIGN KEY——保证一个表中的数据匹配另一个表中的值的参照完整性

用于维护表间的参照完整性,确保子表字段匹配主表的主键或唯一键。

我们先创建一个学生表和一个班级表,展示如下:

Mysql中设计数据表的过程解析

学生表的class_id一列的编号和班级表的id编号是具备对应关系的,但是此时我们并没有进行设置外键约束,这时我们在学生表中插入一条数据,并且这个数据的class_id是不在班级表中存在的。

INSERT into student(name,class_id) VALUES('钱七',5);

Mysql中设计数据表的过程解析

由此可见这个操作是可以执行成功的,显然这个做法是不合理的,那么接下来我们引入:外键用于关联其他表的主键或唯一键
语法:foreign key(字段名) references 主表(列)

CREATE TABLE student(
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20) not NULL,
  class_id BIGINT,
  foreign KEY(class_id) REFERENCES class(id)
);

foreign KEY表示创建外键的关键字 
class_id表示php当前表中哪一个字段与主表建立主外键关系
REFERENCES:关键字,表示后面要引入哪个表的那个列
class(id):指定主表和相应的列 

Mysql中设计数据表的过程解析

 这个MUL就表示存在外键关系 
这时我们插入正确的班级编号是可以的:

Mysql中设计数据表的过程解析

此时再插入不存在的班级编号:

Mysql中设计数据表的过程解析

这样就不行了

5.1问题:当子表中存在对主表的依赖的时候,能不能删除主表中相应的记录?

我们以删除班级编号为4为例:

Mysql中设计数据表的过程解析

这会报一个主外键的错误。
下面我们先删除子表中依赖班级4的数据,再删除主表中班级为4的数据:

DELETE FROM student WHERE class_id=4;android
DELETE FROM class WHERE id=4;
SELECT*from class;

Mysql中设计数据表的过程解析

由此我们可以得出以下结论:
如果要删除主表中的记录,那么子表中的数据不能对该条记录有依赖
也就意味着先要删除子表中的记录,再去删除主表中的记录 

6.CHECK-保证列中的值符合指定的条件

用于限制列值的范围,仅允许符合条件的数据。

CREATE TABLE test_check(
  id BIGINT,
  gender VARCHAR(1),
  CHECK(gender='男' or gender='女')
);

check为关键字
后面的gender表示要检查的列名=后面表示该列允许的值
下面我们执行这条语句:

INSERT into test_check VALUES(1,'无');

Mysql中设计数据表的过程解析

 这样就报错了 因为‘无’并不在允许的值的范围之内。

总结

数据库约束通过自动化校验机制保障数据质量,减少人工干预的风险。合理使用 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEY 和 CHECK 约束,能有效提升数据一致性和业务逻辑的严谨性。

到此这篇关于mysql中设计数据表的过程解析的文章就介绍到这了,更多相关mysql数据表设计内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Mysql中设计数据表的过程解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155517

相关文章

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引