news 2026/9/23 17:27:41

MySQL -- 约束

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL -- 约束

1. 数据库约束

数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) **人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.**并且约束一般是在指定列上创建的.

2. 约束类型

类型

说明

NOTNULL空约束 (常用

指定空约束的列不能存储NULL值

DEFALUT默认约束(常用

当没有给列赋值时使的默认值

UNIQUE唯约束(常用

指定唯约束的列每数据必须有唯的值

PRIMARYKEY主键约束(常用

NOTNULL和UNIQUE的结合,可以指定个列或多个列,有助于防数据重复和提数据的查询性能

FOREIGNKEY外键约束(目前不用)

外键约束是种关系约束,于定义两个表之间的关联关系,可以确保数据的完整性和致性

CHECK约束 (不用)

于限制列或数据在数据库表中的值,确保数据的准确性和可靠性

3. NOTNULL空约束

定义表时某列不允许为NULL时,可以为列添加空约束。

  • 如创建个学表,学名为NULL时,这条记录是不完整的


  • 此时需要约束学名的列不能为NULL


  • 由于name列有空约束,插NULL值时报错,但插入name的正确值就能通过

  • 查看表结构,NULL列为NO表值不允许为NULL,YES表值可以为NUL

4. DEFALUT默认值约束

DEFAULT约束于向列中插默认值,如果没有为列设置值,那么会将默认值设置到该列.

  • 首先我们创建一个表,新增年龄列

示例:

  • 我们希望插入进来的数据,没有给定年龄时,会默认有年龄,那么我们重构学生表,为年龄加入默认约束在要加约束的列名后直接加default默认值即可

    create table family (
    id bigint,
    name varchar(20) NOT NULL,
    age int default 18
    );

  • 插条记录,不指定年龄的值时列使了默认值

  • 查看表结构,年龄列的默认值为18

  • 当我们插入年龄列为NULL时,是否默认值还是18?但当动明确指年龄列为NULL时列值为NULL,不会使用默认值

5. UNIQUE唯约束

指定了唯约束的列,该列的值在所有记录中不能重复,如个的份证号,学的学号等

  • 重构学生表,id列后增加唯一约束

    drop table if exists student;
    create table student2 (
    id bigint UNIQUE,
    name varchar(20) not null
    );

  • 我们发现不设置唯一约束时,id可以重复

  • 我们发现为id列添加唯一约束后,相同的则不能插入进去,唯一约束生效

  • 在id列添加 UNIQUE关键字,为 id 设置唯一约束; 查看表结构,Key列显UNI表唯约束

  • 但当插入NULL值时,依旧可以插入

6. PRIMARYKEY主键约束

主键约束唯标识数据库表中的每条记录。
主键必须包含唯的值,且不能包含NULL值。
每个表只能有个主键,可以由单个列或多个列组成。
通常为每张表都指定个主键,主键列建议使BIGINT类型

  • 重构学表,为ID列添加空和唯约束

    drop table student;
    create table student (
    id bigint not null unique,
    name varchar(20) not null,
    age int DEFAULT 18,
    sno varchar(10) UNIQUE
    );

  • 查看表结构,添加了空和唯约束之后Key列显PRI表主键
    从此处我们可以知道PRIMARY KEY= NOT NULL + UNIQUE

  • 当Id列的值重复时会发主键冲突

  • 通常把主键列设置为动增(auto_increment),让数据库维护主键值PRIMARY KEY auto_increment

  • 插数据时不设置主键列的值

上图中我们插错了一条数据,那我们的自增主键id会走到什么位置?2还是3 接着我们查看一下,此时发现id是从3开始的,这是为何?因为在数据库中插入数据正确或错误,自增主键都会向下走一步,不会回退,这样可以提高查询效率。

  • 查看表结构,Extra列显auto_increment表增

  • 主键值是自增的,那么是否可以不连续呢?此时我们插入主键值为100的数据,我们发现插入成功,所以主键值可以不连续。

  • 那么我们发现,插入100主键值之后,自增主键将从哪里自增呢??我们发现:下一次自增从主键的最大值开始

  • 主键或唯键冲突时的更新操作,插否则更新

1.插入

2.更新
可以使以上语法,如果插时有冲突则更新当前列的值,两受影响,表删除了原来的记录,新写了条记录其update student set name ='钱六',number='100011' where id=100;等效

3.替换
如果表中没有冲突则直接插入新数据,和insert的功能是一样的。


  • 表中不能有多个主键

    drop table student;

    重构学?表

    create table student (
    id bigint PRIMARY KEY auto_increment, # 定义主键
    name varchar(20) PRIMARY KEY
    ); # 定义主键
    ERROR 1068 (42000): Multiple primary key defined # 报错

7. FOREIGNKEY外键约束

外键于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯列存在或为null。

7.1 语法

foreign key (id) references class(id)


  • 删除主表某条记录时,从表中不能有对该记录的引

  • 删除主表时要先删除从表
    删除主表时,应该先解除主外键关系或者删除从表

8. CHECK约束

可以应于个或多个列,于限制列中可接受的数据值,从确保数据的完整性和准确性。
在8.0.16开始全持CHECK约束,之前的版本会忽略CHECK的定义
但是注意,一般在应用程序级别校验

  • 重构学表,有以下要求,年龄不能于16岁,性别只能是男或

    create table student(
    id bigint PRIMARY KEY auto_increment, #设置?增主键
    name varchar(20) not null,
    age int DEFAULT 18,
    gender char(1),
    check (age >= 16),
    check (gender = ‘男’ or gender = ‘?’)
    );

  • c1的值不能为0,c2的值必须于0,c3的值不于c2

    create table t_check (
    c1 int check(c1 <> 0),
    c2 int check(c2 > 0),
    c3 int,
    check(c3 >= c2)
    );

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 1:24:00

AI 开源知识库大战:WeKnora、RAGFlow、FastGPT、FlashRAG,谁更厉害

我看大家对目前的开源RAG知识库都挺感兴趣的&#xff0c;就像来对比一下目前比较流行的几个知识库&#xff0c;看看哪个更适合你&#xff0c;哪个更有钱途&#xff0c;哈哈。 其实真要搭过这几个知识库&#xff0c;就会发现&#xff1a;每个用到的地方&#xff0c;还真不一样&a…

作者头像 李华
网站建设 2026/9/23 8:05:50

【课程设计/毕业设计】基于python-CNN深度学习的水果识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/23 11:12:12

深度学习毕设选题推荐:基于python-CNN的水果识别基于python的水果识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/21 23:27:17

Thinkphp和Laravel框架的高校教室报修管理系统_14oaj0v7

目录高校教室报修管理系统摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理高校教室报修管理系统摘要 该系统基于ThinkPHP和Laravel框架开发&#xff0c;旨在为高校提供高效的教室设备报修与管理解决方案。通过整合两种框架的优势&#xff0c;…

作者头像 李华
网站建设 2026/9/21 23:16:17

LangChain-08 Query SQL DB 通过GPT自动查询SQL

我们需要下载一个 LangChain 官方提供的本地小数据库。 安装依赖 SQL: https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql Shell: pip install --upgrade --quiet langchain-core langchain-community lang…

作者头像 李华