MySQL数据库基础:约束

news2024/9/23 17:20:57

 

 💎我的主页:MySQL

在这里插入图片描述

 

💎1. 约束的概述

约束是作用于表中字段的规则,用于限制存储在表中的数据

目的:保证数据库中数据的正确性,有效性和完整性

💎2. 约束的分类

💎2.1 非空约束

非空约束限制了该字段不能为null,

-- 创建student表,约束条件:id不能为null
create table student
(
    id   bigint not null,
    name varchar(50)
);

 之后再去尝试插入id为空的数据时就会报错

 💎2.2 唯一约束

-- 创建student表, 约束条件:id 唯一
create table student
(
    id bigint unique,
    name varchar(50)
);

 同理,此时插入相同的id时也会报错

 null可以重复插入


💎2.3 默认约束

默认约束规定了没有给列赋值时的默认值

-- id设置为唯一,设置默认约束条件
create table student
(
    id   bigint unique,
    name varchar(50) default '张某'
);

如果已经手动指定了null的话,就按照手动指定的,用户指定的优先级高于默认的优先级

💎2.4 主键约束

主键约束(primary key)是非空(not null)和唯一(unique)的结合,主键约束的列既是非空的也是唯一的

-- 设置id为非空且唯一
create table student(
    id bigint not null unique ,
    name varchar(50) default '张某'
);

如果把键设置为非空且唯一,就会被设置为主键

-- 设置主键并指定自增类型
create table student(
    id bigint primary key auto_increment,
    name varchar(50) default '张某'
);

💎2.4.1 全列插入:

 设置自增类型,表示在当前表的上一条记录的基本上加1

之后再进行添加数据,并且尝试向主键中添加一个null值

在上面的全列插入写入数据时,不具体指定主键列的值,用null代替,会自动生成id,虽然说,主键是非空且唯一的,但由于设置了自增类型,所以当添加为null时,数据库会根据自增原则,自动生成 id 

💎2.4.2 指定列插入:

指定列插入时,也会自动生成 id ,作为数据行的主键

一个表中只能有一个主键,但一个主键可以包含多个列,称为复合主键

💎2.4.3 直接指定一个主键值的情况:

新增一个主键为8的数据也成功执行了,并且后面再新增一个null的数据按照8进行自增,生成了9

 

接着来指定一个小于之前主键的值,然后再新增一个主键为null的数据,可以发现,后面是按照当前表中最大的值进行递增的

insert into teacher(work_number, name)
values (2022, '张三'),
       (2023, '李四');

insert into teacher
values (8, 2024, '王五');
insert into teacher
values (null, 2025, '赵六');
insert into teacher
values (4, 2026, '小明');
insert into teacher
values (null, 2027, '大明');

select id, work_number, name
from teacher;

 

💎2.4.4 复合主键:

 一个表中只能有一个主键,但一个主键可以包含多个列,称为复合主键

这样直接定义两个主键会报错

 复合主键的定义方法:

-- 复合主键的定义
create table pre_text
(
    id   bigint,
    name varchar(50),
    mail varchar(50),
    primary key (id, name)
);

 既然这些列都是主键,那么在进行唯一判断的时候,只有复合主键中所有的列相同才能够被判定相同,例如下面的唯一判断是没有问题的

 下面这个只有一个id列相同,name列不同,所以可以直接插入

💎2.5 外键约束

💎2.5.1 插入

外键约束语法:

外键约束用来将两张表的数据之间建立连接,从而保证数据的一致性和完整性

 此时创建的两张表没有任何的主外键关系,所以说插入一条不存在的班级编号在学生表里也是可以添加成功的

 这时设置class表的id 为主键,student表的 class_id为id的外键

create table class
(
    id   bigint primary key auto_increment,
    name varchar(20)
);

create table student
(
    id       bigint primary key auto_increment,
    name     varchar(20),
    class_id bigint,
    foreign key (class_id) references class (id)
);
desc student;

此时主外键关系已经关联完毕,再次尝试插入插入一条不存在的班级编号到学生表里

-- 初识话插入数据
insert into class
values (1, 'it01'),
       (2, 'it02'),
       (3, 'it03');
insert into student(id, name, class_id)
values (1, '张三', 1),
       (2, '李四', 2),
       (3, '张三', 1);

-- 尝试插入不合法数据
insert into student(id, name, class_id)
values (1, '赵六', 8);
-- 插入合法的数据
insert into student(id,name,class_id)
values (4,'王五',2);
select * from student;
select * from class;

当插入class表中不存在的8时,就会报错 

插入班级表中的id存在的值时,就可以正常插入

 

💎2.5.2 删除 

子表中的数据的删除没有限制,但是删除主表中的数据时,需要考虑是否子表中还存在对主表的依赖,下面来演示一个例子:

-- 删除主表数据
delete from class where id = 3;

此时子表中有一条数据依然还依赖着主表,还是会报出主外键关系的错误 

 把这条数据删除就可以删除主表中的数据了

 

delete from student where id = 4;
delete from class where id = 3;

 

💎2.6 检查约束

check - 保证列中的值符合指定的条件

-- 检查约束
create table person(
    name varchar(20),
    gender varchar(1),
    check ( gender = '男'or gender = '女' )
);

-- 符合
insert into person (name, gender) values('张三','男');
-- 不符合
insert into person (name, gender) values('张三','无');

 

符合check里的条件就可以插入,不符合就会报错

 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux之top

要在 Linux 系统上查看 CPU 使用情况,可以使用top命令: 根据您提供的 top 命令的输出,我们可以看到系统的一些基本信息和当前运行的进程。下面是输出的主要部分的解释: 仅供参考: 系统概述: 时间:当前时间…

MATLAB(R和C++)大肠杆菌合成生物机械数学模型

🎯要点 🎯合成大肠杆菌生物学网络 | 🎯量化基因型-表型图 | 🎯化学诱导离散浓度下培养细菌评估整个浓度范围内的表达模式 | 🎯定性更改合成模型拓扑结构、定量更改相互作用的强度 | 🎯开发机械数学模型 | …

新增题目同步到ES

文章目录 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)🌟 亮点功能📦 spring cloud模块概览常用工具 🔗 更多信息1.创建ES的索引和映射1.创建索引2.创建映射 2.sun-club-infra …

C语言 ——— 学习、使用memmove函数 并模拟实现

目录 memmvoe函数的功能 学习memmove函数​编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数,都是内存拷贝,唯一的区别是memcpy函数不能成功拷贝原数据,而memmvoe函数可以 举例来说: [1, 2, 3…

【Material-UI】Checkbox 组件自定义详解

文章目录 一、Checkbox 组件概述1. 组件介绍2. 基本用法 二、Checkbox 组件的基本自定义1. 更改复选框的颜色2. 调整复选框的大小 三、Checkbox 组件的高级自定义1. 自定义图标2. 自定义复选框的边框和形状 四、使用主题进行全局自定义1. 定义全局主题2. 动态主题切换 五、总结…

springboot整合springmvc使用外置的Servlet容器

目录 1. 创建2. 配置3. 配置Tomcat4. 心得 1. 创建 2. 配置 首先创建两个文件夹 配置: 3. 配置Tomcat 右上角的按钮 添加 保证这几个不冲突,保证你的tomcat的文件没问题!!! 点击部署 选择第二个war exploded…

零基础5分钟上手谷歌云GCP核心云开发技能 - 搭建和维护高可用数据库集群

简介: 欢迎来到小李哥全新谷歌云GCP云计算知识学习系列,适用于任何无云计算或者谷歌云技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台&#xff0…

GPT解逻辑数学题之8个8变1000的故事

目录 初试正解 我: GPT4: 再问思索 我: GPT4: 提醒错误 我: GPT4: 给出正解提示 我: GPT4: 不愿放弃 我: GPT4: 再次尝试 我: …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能: 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件(夹)的作用: 五、常用命令 一、Nginx的功能: 1.反向代理:例如我有三台服务器&#x…

Linux源码阅读笔记20-PCI设备驱动详解

PCI基础 PCI总线为高性能局部总线,主要解决外部设备之间以及外部设备与主机之间高速数据传输。在数字图形、图像等处理,以及告诉实时数据采集与处理等队数据传输速率要求高的应用中,采用PCI总线进行数据传输。PCI规范能够实现32位并行数据传…

我在高职教STM32——I2C通信入门(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

STM32G070KBT6的RTC HAL库使用

*配置问题 首先使能时钟源,这里在时钟配置中选择LSI,为什么后面会说,然后使能Calender结构体,保证可以对RTC的年月日时分秒等进行写入和读取;alarmA和alarmB是闹钟,这里不用就Disable; Tam…

突破•指针六

听说这是目录哦 数组和指针笔试题解析🫧一维数组1🍕🍕🍕🍕🍕🍕🍕 字符数组1🍔🍔🍔🍔🍔🍔🍔2&#…

高并发下的分布式缓存 | Read-Through缓存模式

缓存系列文章链接如下: 高并发下的分布式缓存 | 缓存系统稳定性设计 高并发下的分布式缓存 | 设计和实现LRU缓存 高并发下的分布式缓存 | 设计和实现LFU缓存 高并发下的分布式缓存 | Cache-Aside缓存模式 Read-Through 模式的缓存操作 Read-Through模式的一个关键…

Scanner类、String类和StringBuffer类的相关使用

一、Scanner: 主要用于键盘录入的 构造方法: Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值。 1、next()和nextLine()区别: String line sc.next(); // 不会接收特殊字符,比如空格回…

高效的编程学习方法和技巧

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱&…

基于单片机的智能空气净化系统

【摘 要】 设计了一种基于单片机的智能空气净化系统。通过传感器实时采集空气中 PM2.5 、甲醛等有害健康物质的浓度,将各项数据显示到液晶显示屏,当浓度超过设置的警戒值时,控制蜂鸣器发出警报。根据浓度大小控制空气净化器电机转速&#xf…

04.C++类和对象(中)

1.类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重…

Selenium + Python 自动化测试04(操作方法1)

上一篇我们讲述了webdriver 元素定位方法。我们对如何定位元素有了一个基本的认识。接着我们详细讲述对元素常见的一些基本操作方法,以便我们可以做很多功能操作的测试。这一篇侧重最基本的操作方面。 1、send_keys 方法 此方法类似于模拟键盘输入。还是以下面网站…

React项目中引用视频播出插件 easyPlayer.js 部署趟坑日志

目录 前文记录背景问题摸排:第一天前端打包失败?远程打包逻辑与本地打包逻辑不一致?远程入口页被篡改?再次排查本地webpack打包逻辑 问题摸排:第二天确认本地与远程打包一致排查远程nginx代理定位问题 index.html 的所…