当前位置: 首页 > news >正文

【MySQL】数据库约束

系列文章目录

第一章 数据库基础
第二章 数据库基本操作


文章目录

  • 系列文章目录
  • 前言
  • 约束关键字一览
  • NOT NULL
  • UNIQUE
  • DEFAULT
  • PRIMARY KEY
    • 自增主键
  • FOREIGN KEY
  • 总结


前言

在学习了数据库的增删改查操作之后,接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据库约束是为了能够更稳妥的保证数据的安全,以更加严格的标准来管理数据。


约束关键字一览

  1. NOT NULL -表示某列不能存储NULL值
  2. UNIQUE -保证某列的每行必须有唯一的值
  3. DEFAULT -规定没有给列赋值时的默认值
  4. PRIMARY KEY -NOT NULL 和 UNIQUE的结合,确保某列的数据不为空且唯一
  5. FOREIGN KEY -保证一个表中的数据匹配另一个表中的值的参照完整性

NOT NULL

在一个列中的数据不允许为空值。
以student表为例,在这个表中,Sno的NULL列表示YES,即允许Sno值为null
在这里插入图片描述
而以我们的日常生活经验来看,Sno是不允许为空的,因此我们需要为Sno加上约束Not Null 。

 create table student(Sno int not null,name varchar(20));

在这里插入图片描述
接下来对数据进行插入操作,我们可以看到只有当Sno 不为空时,才能插入成功;当将Sno = null 或不插入Sno 的数据,则数据库就会校验报错。
在这里插入图片描述

UNIQUE

使用unique,在该列的数据不允许出现重复的情况,通常用于学号、身份证号等信息。

create table student(Sno int not null unique,name varchar(20) unique);

我们可以查看表结构,观察可知Sno 设置为not null + unique => Primary key
name设置为unique
在这里插入图片描述
对表进行插入操作,只有满足所有的约束条件才能够插入数据,可以通过下面的SQL案例进行分析。
当选择了unique约束之后,每次插入/修改操作都会先对数据进行查询,如果发现不符合条件才会返回失败的结果。这从侧面可以看出效率会降低,但出错的概率就大大减小了。
在这里插入图片描述

DEFAULT

设置默认值。 当进行指定列插入操作时,未被指定的列就会保持默认值。
以下面的SQL语句为例,插入的数据如果没有指定名称,那么就默认name = ’无名氏‘

 create table student(id int not null unique,name varchar(20) default '无名氏');

在这里插入图片描述

PRIMARY KEY

主键 是一条数据的身份标识。主键是unique 和not null的结合体。
**一个表只能由一个主键,大多数情况主键使用的是整数形式,**但也可能会出现多个列的内容联合到一起构成的组件。

create table student(id int primary key , name varchar(20));

在这里插入图片描述

自增主键

为了解决主键不重复的问题,基于常用的以id作为主键的情况,MySQL提供了自增主键。顾名思义,在每次插入的数据中会在上一条数据的值+1.自增主键的关键字为auto_increment

 create table student(id int primary key auto_increment,name varchar(20));

当对主键采用自增形式之后,我们可以通过下图的SQL操作得到id在不指定时是自动增加的。即便在数据中没有数据,那么id就会自动从1开始

在这里插入图片描述
在这里插入图片描述
通过自增主键,我们就不需要每次都添加id的数据了,如果用户误操作将id值设置为null,MySQL也可以自动使用自增主键将它补上。当然,SQL也支持我们主动插入数据。
在这里插入图片描述

insert into student values(100,'lisi');

当我们插入id = 100的数据后,我们可以成功查询到数据,那么2-99的数据应该如何处理?在MySQL中是直接废弃掉的,从100之后开始继续自增。
在这里插入图片描述

FOREIGN KEY

外键的约束用于两张表之间的关联关系。为了能够连接两个表,外键要么是主键,要么是unique 在建立外键约束之后,后续对子表进行操作就会频繁涉及到两个表之间的操作。
以学生和班级之间的关系为例,在学生表中不仅有学号id,姓名name,同时还有关联着班级表的classId,而classId就是它的外键。同时还有班级表,里面有班级编号classId、班级名称className

//创建class表
create table class(classId int primary key auto_increment,className varchar(20));
//创建student表
create table student(id int primary key auto_increment,name varchar(20),classId int,foreign key(classId) references class(classId));

通过foreign key将student表中的classId与class表中的classId相关联。
原则上来说,在student表中插入的classId必须要在class表中存在。class表制约student表,而student表属于被制约的一方。因此他们之间也被成为父子表。
以下面的SQL语句我们可以看到,当class表中不存在id = 1 的数据时,MySQL将会报错。而当class表中存在对应的数据,则可以插入成功。
在这里插入图片描述
那么我们可以直接删除class表中的数据吗?
在下面的class表中,我们删除的classId = 100的数据是不被student表关联的,因此可以成功删除。
在这里插入图片描述
而在存在关联的classId = 1的数据中,我们是无法删除的。
在这里插入图片描述


总结

对表属性进行约束能够更好的对数据进行管理和区分,也提高了代码的准确性,提升了工作效率。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Kubernetes】k8s集群安全机制
  • CPU飙升 怎么定位问题
  • nginx代理转发如何配置
  • MySQL(SQL函数)
  • 适配器模式, 修饰器模式 与 代理模式
  • 三层switch转一层switch的处理方法
  • 大数据基础
  • C++第八章:多态性
  • 完美解决html2canvas + jsPDF导出pdf分页内容截断问题
  • 【产品经理】定价策略
  • DotPlot 的宽高自动设置 | 线性拟合
  • 英语写作中“传统的”traditional conventional 的用法
  • 游戏引擎phaser.js3的使用之玩家和静态物理组碰撞
  • AT_zone2021_d 宇宙人からのメッセージ 题解
  • C语言——构造(结构体)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017前端实习生面试总结
  • Cumulo 的 ClojureScript 模块已经成型
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • es6要点
  • Hibernate最全面试题
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Js基础——数据类型之Null和Undefined
  • Js基础知识(一) - 变量
  • Mysql优化
  • React-flux杂记
  • underscore源码剖析之整体架构
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 你不可错过的前端面试题(一)
  • 使用 @font-face
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 优秀架构师必须掌握的架构思维
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​业务双活的数据切换思路设计(下)
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (void) (_x == _y)的作用
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • **PHP二维数组遍历时同时赋值
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .sys文件乱码_python vscode输出乱码
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Pointcut 使用
  • @PreAuthorize注解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [Android] Android ActivityManager
  • [ANT] 项目中应用ANT
  • [ARM]ldr 和 adr 伪指令的区别