MySQL 约束控制

news2024/11/25 16:52:54

文章目录

  • 约束控制
    • 非空约束
    • 主键约束
    • 默认值约束
    • 唯一约束
    • 外键约束


约束控制

在这里插入图片描述

数据的完整性约束(简称“约束”)是在表和字段上强制执行的数据检测规则,是为了防止不规范的数据进入数据库。当我们对数据进行 DML 操作时,数据库管理系统(DBMS)会自动按照我们设置的约束条件对数据进行检测,以保证数据存储的完整性和准确性。

完整性约束分为 4 类:实体完整性约束、域完整性约束、参照完整性约束、用户自定义完整性约束。

  • 实体完整性约束:用来标识表中的每一条记录都代表一个实体,如主键约束;
  • 域完整性约束:用来针对单元格的约束,如非空约束等;
  • 参照完整性约束:指多表之间的对应关系,在一张表中执行数据插入、更新、删除等操作时,DBMS 都会跟另一张表进行对照,避免不规范的操作,以确保数据存储的完整性,如外键约束;
  • 用户自定义完整性约束:用户根据实际的要求来定义,在执行数据插入、更新等操作时,DBMS 会检查数据是否满足检查约束中的限定条件,避免不符合条件的操作,以保证数据存储的准确性,如检查约束(MySQL 不支持,Oracle 支持)。

在 MySQL 中支持的约束有 6 种,分别是:非空约束、主键约束、默认值约束、唯一约束、外键约束和自定义检查约束。

根据约束添加的位置,我们可以把约束分为两类:

  • 列级约束:即直接在定义的字段名和类型后面追加约束。但该方式只支持默认值约束、非空约束、主键约束、唯一约束。
  • 表级约束:即在各个字段定义完后进行添加。表级约束不支持非空约束和默认值约束。

非空约束

创建非空约束使用的语句是 NOT NULL,其作用是保证该字段不能为空。前面在查看 student 表结构的时候,表头中有一列名为 Null,该列注明了字段是否添加了非空约束。 我们把讲 3NF 的时候的专业信息表创建出来,并用列级约束的形式设置专业字段为非空。其 SQL 语句如下:

create table specialty(
specialty_name varchar(20) not null,
specialty_college varchar(20)
);

输出结果:
在这里插入图片描述

使用 desc ,查看表结构:

desc specialty;

输出结果:
在这里插入图片描述

在我们插入数据的时候,如果该字段值为空就会出错,如下所示:

insert into specialty values(null,'计算机学院');

输出结果:
在这里插入图片描述

这里需要注意一点的是空值(NULL)与空字符串(‘’)的区别。

  • 查询判定的方式不同:判定某值是否为 null,可以使用 is null 或者 is not null ;而判定某值是否空字符串,使用 =、<> 来运算。
  • 是否参与运算:空值(NULL)是不参与运算的,而空字符串可以。
  • 是否占用空间:空值(NULL)是占用空间的,而空字符串(‘’)是不占用空间的。所以在设计表时,我们的字段尽可能的设置为 not null 约束。

主键约束

创建主键约束使用 PRIMARY KEY 语句,其作用是保证该字段的值具有唯一性。每张表只能创建一个主键,是该表的唯一标识,且默认自带非空属性。 利用修改表的方式,创建主键约束。修改 student 表,使 student_id 成为主键,具体实现 SQL 语句如下:

alter table student modify student_id int primary key;

输出结果:
在这里插入图片描述

采取 desc 命令查看表结构,Key 这一列出现 PRI 即设置成功。

desc student;

输出结果:
在这里插入图片描述

主键设置成功后,插入数据就要考虑它的唯一性和非空性。当前表中的记录有:

select * from student;

输出结果:

在这里插入图片描述

当插入新记录的 student_id 为 1,会给出错误提示,如下所示:

insert into student values(1,'小刘','大数据专业');

输出结果:
在这里插入图片描述

主键不能重复,需要我们在插入数据的时候知道待插入记录的主键是否已经存在。数据少且有序比较好确认;可如果数据多且乱序,确认主键重复的问题就会变得很麻烦。

有没有办法在我们插入记录的时候,让主键自动保持唯一性呢?

答案就是使用自增序列(auto_increment),一张表有且只能有一个自增序列。自增序列一般和主键搭配使用,使用自增序列字段的类型为整型。

修改 student 表的主键,使 student_id 具有自增属性。使用 drop 语句删除已经存在的主键特性,其实现 SQL 语句如下:

alter table student drop primary key;

输出结果:
在这里插入图片描述

再次设置 student_id 为主键,且具有自增属性。其 SQL 语句如下:

alter table student modify student_id int primary key auto_increment;

输出结果:
在这里插入图片描述

使用自增长的好处是,我们不用担心主键会重复的问题。需要注意,在插入数据的时候,自增长字段的值使用 null 来代替,如下所示:

insert into student values(null,'小赵','计算机专业');

输出结果:
在这里插入图片描述

查询结果:

select * from student;

输出结果:
在这里插入图片描述

默认值约束

创建默认值约束使用的语句是 DEFAULT,其作用保证该字段总会有值。设置所有学生的专业默认是大数据专业,其 SQL 语句如下:

alter table student modify student_specialty varchar(20) default '大数据专业';

输出结果:
在这里插入图片描述

下列语句不给 student_specialty 字段指定值:

insert into student(student_id,student_name) values(null,'小蓝');

因为默认值约束的存在,所以即便不给 student_specialty 字段指定值,系统也会自动插入默认值。查看插入后的结果如下:

select * from student;

输出结果:
在这里插入图片描述

唯一约束

创建唯一约束使用的语句是 UNIQUE,其作用保证字段值的唯一性。唯一约束和主键约束的相同点都是保证值的唯一性。区别在于,唯一约束在一张表中允许出现多个,而主键约束只能有一个。 给满足 3NF 的专业信息表中的专业名称字段创建唯一约束,使用表级约束的方法,创建的 SQL 语句如下:

create table specialty(
specialty_name varchar(20),
specialty_college varchar(20),
unique(specialty_name)
);
insert into specialty
values
('大数据专业','计算机学院'),
('计算机专业','计算机学院');

采取 desc 命令查看表结构,Key 这一列出现 UNI 即设置成功。

desc specialty;

输出结果:
在这里插入图片描述

使用 desc 命令可以查看到 specialty_name 所在行 key 这一列显示 “UNI”,即表示唯一约束设置成功。

外键约束

创建外键约束使用的语句是 FOREIGN KEY,其作用为限制两个表的关系,保证表中该字段的值来自于关联表。外键约束必须使用表级约束的方式来定义。

将学生表中的 student_specialty 设置为外键,关联 specialty 表中的 specialty_name。其 SQL 语句如下:

alter table student add foreign key(student_specialty) references specialty(specialty_name);

输出结果:
在这里插入图片描述

关键字 references 连接关联的表。需要注意,主表在插入记录的时候,外键的值必须能在关联表的关联列中找到,否则插入信息失败。 现 specialty 表中有数据如下:

select * from specialty;

输出结果:
在这里插入图片描述

在 student 表中插入记录的时候,字段 student_specialty 的值只能是这两个其中之一,否则会报错,如下所示:

insert into student values(null,'小兰','管理专业');

输出结果:
在这里插入图片描述

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

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

相关文章

被面试官上过一课后,我学到的不止是如何答题

写在前面双向奔赴切勿急于否定自己做足功课关于简历关于简历投递常见面试题汇总● 按照一般的面试流程&#xff0c;先来一个自我介绍吧● 你的优点和缺点是什么● 你理解的项目经理是干什么的● 能完整的说一下软件项目的整个流程么● 项目经理和产品经理的区别在哪里● 项目管…

UniAD:实现多类别异常检测的统一模型

来源&#xff1a;投稿 作者&#xff1a;Mr.Eraser 编辑&#xff1a;学姐 论文标题&#xff1a;用于多类异常检测的统一模型 论文链接&#xff1a;https://arxiv.org/abs/2206.03687 论文贡献&#xff1a; 提出UniAD&#xff0c;它以一个统一框架完成了多个类别的异常检测。 …

Jetson 硬件 安装SSD固态作为启动盘以及安装CUDA等

Jetson硬件的自带闪存一般较小&#xff0c;只能安装jetpack等基本的环境&#xff0c;所以需要额外增加SSD固态或SD卡作为存储空间&#xff0c;很明显SSD的读取速度远远大于SD卡&#xff0c;所以为更好发挥出Jetson 的计算性能&#xff0c;我们选择使用SSD固态作为存储 1. 安装…

随机森林原理和性能分析

文章目录 随机森林入门构造随机森林随机森林性能随机森林特点 随机森林入门 决策树入门、sklearn实现、原理解读和算法分析中针对决策树进行了详细的描述&#xff0c;但是其只考虑了一颗决策树的情况。俗话说&#xff0c;三个臭皮匠&#xff0c;顶个诸葛亮。本文将研究如何通过…

C++:深入理解多态,多态实现原理及拓展

文章目录 1. 理解虚表1.1 虚表1.2 验证1.3 子类虚表1.4 相同类不同对象的虚表 2. 静态绑定和动态绑定2.1 静态绑定2.2 动态绑定 3. 多态的实现原理3.1 向上转型3.2 多继承3.3 原理 4. 拓展4.1 构造函数能不能是虚函数4.2 父类和子类的析构函数在底层的命名问题4.3 对象之间无法…

[论文阅读] (30)李沐老师视频学习——3.研究的艺术·讲好故事和论点

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SpringMVC第十一阶段:SpringMVC 拦截器执行源码解析

SpringMVC 拦截器执行源码解析&#xff1a; 1、执行doDispatcher做请求分发处理 1.1、调用getHandler()获取请求处理器&#xff0c;处理器中包含请求的方法和拦截器信息 getHandlerInternal() 根据请求地址获取对应的目标方法getHandlerExecutionChain() 获取请求地址对…

(转载)基于鱼群算法的函数寻优算法(matlab实现)

1 理论基础 1.1 人工鱼群算法概述 人工鱼群算法是李晓磊等人于2002年提出的一类基于动物行为的群体智能优化算法。该算法是通过模拟鱼类的觅食、聚群、追尾、随机等行为在搜索域中进行寻优&#xff0c;是集群体智能思想的一个具体应用。生物的视觉是极其复杂的&#xff0c;它…

Java006——对第一个Java程序HelloWorld的简单介绍

一、HelloWorld.java程序整体认识 public class HelloWorld { //创建一个名字叫HelloWorld的类&#xff08;Java中的类叫class&#xff09;public static void main(String[] args) {//主程序入口&#xff0c;类似C语言main函数System.out.println("He…

python之scipy.signal重采样

前言 在复现LiftingNet过程中&#xff0c;了解到作者对于不同转速设备的机械信号进行重采样来矫正转速&#xff0c;也就是固定长度的样本包含了相同旋转周期的设备信息&#xff0c;而非相同时间长度。po一下原文&#xff1a; 这里其实用到了阶次分析的原理&#xff0c;该样本…

【vue】生命周期,组件,插槽,依赖注入,实现分页器组件,异步组件,keep-alive

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 生命周期总结组件例子轮播图组件 在组件中使用v-modelMixin插槽具名插槽实现一个分页器 依赖注入…

【软件测试】软件测试总结笔记(1)

软件测试理论总结 1.Introduction1.1 What is Software Bug1.2 Tester的职责和目标其他概念软件测试的分类 2.软件开发生命周期Software Development ProcessSoftware Development Lifecycle ModelsTDD - Test-Driven Development测试驱动开发&#xff08;一种敏捷开发&#x…

城市微博签到数据分享地址解码与纠偏教程

收录于合集 #开源4个 #GIS34个 #社交媒体2个 #大数据4个 哈喽大家好&#xff0c;我又来啦&#xff01;最近一直有小伙伴私戳问我要 签到数据&#xff0c;本着 开源共享的精神&#xff0c;我这次给大家分享中国多个城市2022年9月的匿名签到数据&#xff0c;欢迎大家点击在看…

用Python做兼职,轻松赚取零花钱,分享Python兼职经验

文章目录 前言一、技术方案二、接单流程三、注意事项四、总结 前言 某家电商公司需要从竞争对手的网站上获取商品信息&#xff0c;以便更好地了解市场情况和竞争对手的策略。由于该公司没有专门的技术团队&#xff0c;因此他们需要找一家专业的爬虫服务公司来帮助他们完成这项…

冈萨雷斯DIP第4章知识点

文章目录 4.1 背景4.3 取样和取样函数的傅里叶变换4.5 二变量函数的傅里叶变换4.6 二维 DFT 和 IDFT 的一些性质4.6.6 二维离散卷积定理 4.7 频率域滤波基础4.7.3 频率域滤波步骤小结4.7.4 空间域和频率域滤波之间的对应关系 4.8 使用低通频率域滤波器平滑图像4.9 使用高通滤波…

Nacos作为服务注册中心简单示例

一、服务注册与发现场景 主要包含两个服务&#xff1a; zhshl-order服务: 作为服务消费者zhsl-stock服务: 作为服务提供者 当我们启用服务发现的时候,需要进行的操作主要有三步 0、前置条件,需要先搭建好一个nacas服务&#xff0c;可以是一个集群或者是单个nacos服务。可以…

MySQL 数据定义语言 DDL

文章目录 数据定义语言 DDL表的设计范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 创建表修改表删除表截断表 数据定义语言 DDL 前面我们学习的 DML 语言&#xff0c;主要实现对数据的增、删、改等基本操作…

零基础入门网络安全必看的5本书籍(附书单pdf)

作为一个Java转行网络安全的过来人&#xff0c;我深知自学时的种种不易&#xff0c;同时也经常有粉丝朋友问我&#xff1a;刚入门应该怎么学、有哪些书籍推荐等问题&#xff0c;今天我就把我自己的学习书单分享给大家&#xff0c;希望对大家有帮助&#xff01; 一、5本必读书籍…

JVM垃圾回收——对象进入老年代

目录 1、什么是大对象以及大对象对垃圾回收的影响 2、什么情况下对象会进入老年代 2.1 当创建对象的大小超过-XX:PretenureSizeThreshold的设定值 2.2 长期存活的对象将进入老年代 2.3 动态年龄判定 2.4 空间担保分配 什么是空间分配担保&#xff1f; 为什么要…

uploads靶场通关(1-11关)

Pass-01&#xff08;JS校验&#xff09; 看题目我们准备好我们的php脚本文件&#xff0c;命名为1.php 上传该php文件&#xff0c;发现上传失败 方法一&#xff1a;将浏览器的JavaScript禁用 然后就能上传了 方法二&#xff1a; 查看源码&#xff0c;发现只能上传以下形式的文…