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

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1