数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用

1. 约束类型

  • NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项
  • UNIQUE - 保证某列的每行必须有唯一的值, 不能重复  每次插入/修改时, 都要先触发查询, 如果当前插入/修改的值已经存在, 就会插入/修改失败
  • DEFAULT - 规定没有给列赋值时的默认值  一般在指定列插入时会用到, 如果没有规定默认值, 默认值就为NULL
  • PRIMARY KEY - 主键  NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 外键  涉及到两个表之间的关系 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

2. not null

create table 表名 (列名 类型 not null,...);

创建一个学生表, 如果没加not null:

 Null这一列为YES, 表示这一列可以为空

加上not null:

 Null这一列为NO, 表示这一列不可以为空

当我们在对这一列的数据进行添加和修改时, 不可以附空值:

2. unique

 create table 表名 (列名 类型 unique,...);

创建一个学生表, 如果没加unique:

是允许插入重复数据的

加上unique:

 KEY这一列中id为UNI, 表示id这一属性是unique的

当我们在对这一列的数据进行添加和修改时, 不可以添加和修改为重复值:

3. default

create table 表名 (列名 类型 default 默认值,...);

创建一个学生表, 如果没加default:

没有指定id为2时的name, 那么默认值为NULL

加上default:

 Default这一列对应的name为'无名氏', 将name的默认值设为'无名氏'

再进行指定列插入时, 不指定name:

4. primary key

create table 表名 (列名 类型 primary key,...);

注意: 一个表中只能有一个主键, 但一个主键不一定只对应一个列, 可以是多个列联合作为主键, 称为联合主键 

指定student表中id作为主键:

Key这一列id为PRI, 表示id为主键, 并且Null为NO, 主键不能为NULL 

 因为主键的条件是not null + unique, 所以可以这样定义:

默认也是主键  

自增主键:

一般来说, 我们会使用整数id作为主键, 那么在实际开发中, 我们如何保证id的值是非空且唯一的呢?

在mysql中提供了"自增主键", 在每次插入新的数据时, 都能把主键基于最大的主键值+1

语法:

create table 表名 (列名 类型 primary key auto_increment,...);

例:

将学生表的id设为自增主键

Extra中auto_increment就是对自增主键的说明

插入数据:

此时, 插入的null并非是真的null值, 而是根据自增规则, 自动插入数据, 默认从0开始自增

当然这种情况下, 我们也可以手动指定id, 不一定非要依赖自增主键:

此时再次指定null, 下一个id应该是101:

如果将id为100和101都删去, 再次插入null, 下一个id是102!

如此, 5-99这些id, 就不会再自增主键时出现了

基于分布式系统下生成唯一id:

自增主键, 本质上上mysql服务器存储了当前表中的最大id, 再进行累加的, 但是如果基于分布式系统, 存储数据的时候, 每一个机器都存储了部分数据, 这些数据分别都有最大值, 那么显然"自增主键"就无能为力了

那么在分布式系统中, 生成唯一id算法有很多种, 此处给出一个最简单最朴素的方式, 其他的生成算法核心思路大同小异的:

时间戳(ms) + 机器的编号(应用程序所谓机器) + 随机因子(随机数)

---> 得到一个字符串

---> 计算hash值, 得到一个整数, 作为id 

简单介绍计算字符串hash值的算法:

java中自带一个比较简单的计算方式, 但是在实际开发中用得不多, 在实际开发中, md5, sha1用的多, 但其实这几种算法都是数学问题, 只是套用的公式不同, 想要了解具体的算法并不容易, 但我们更关注的是算法的特性

以md5 为例(其他大同小异), 主要有三个方面特性:

  1. 定长  无论输入的字符串多长, 最终算出来的hash值都是一样长的
  2. 分散  输入的字符串, 那怕只有一点点不一样, 得到的md5值都会差异很大 (这也是称为hash算法的根本)
  3. 不可逆 给你原始字符串, 计算hash值, 对计算机来说非常简单, 但黑泥hash值,还原成原始的字符串, 理论上不可行

5. foreign key

create table 表名 (列名 类型 , 列名 类型, ... , foreign key (当前表中(子表)的某一列名) references 表名2 (表名2中(父表)的某个列名));

注意:  引用父表的这个列, 要么是主键, 要么是unique, 不然不能当做外键使用

例:

如果不加外键链接, 创建student表和class表:

 给class添加数据:

给student添加数据:

此时我们看到, 给学生班级id设成100也是可以通过的,  但实际班级id没有100, 所以就会出现问题

加外键链接, 创建student表和class表:

此时, student的classID和class的classID就建立了联系, student中classID的值, 必须在class中classID中存在!!  

class表, 就对student表产生了制约, 此时就把class表(制约别人的表) 称为"父表"(parent table), 把student表(被制约的表) 称为"子表"(child table)

此时向表中添加数据:

因为class表中没有classID为100的班级, 所以添加失败, 触发了外键约束

删除父表中的外键约束:

删除classID为3可以成功, 而删除classID为1不成功, 因为在子表中已经使用个这个classID

所以实际上, 确实是父亲约束儿子, 儿子不能随意添加和修改, 但同时儿子也在约束父亲, 不能随意删除和修改, 是双向约束的过程!!

考虑一个场景: 一个电商网站, 肯定会有两个数据库:

商品表(id,name,price...)

订单表(orderid, ...,goodid)

订单表中, 存在一些记录, 引用自商品表的某个数据

未来某一天, 我不买这个商品了, 要下架, 如果这时想要删除这件商品, 还不被允许的, 那应该怎么办呢?

答案是: 添加标记字段

商品表(id,name,price... isOK)

isOK如果是1, 表示有效数据, isOK是0, 表示无效数据

当我们要删除商品时, 不再是delete, 而是将isOK改成0, 后续用户查询商品列表时, 也是通过条件, 只返回isOK为1的记录, 此时即保证了数据能够删除, 也不违背外键约束, 这种删除称为逻辑删除

其实在硬盘上删除一个文件, 也不是说把硬盘上的对应空间的数据给擦除, 也是标记成无效(标记成无效后, 可能就会被系统用来存储别的数据了)

那么如何删除数据才是安全的呢?  --- 物理删除!!(把硬盘砸了)

6. check

check mysql5.7并不支持, 主要的作用是在执行语句之前判断是否满足check后的条件

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

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

相关文章

原来Rstudio还可以这么使用,又方便了一些

在别人的电子书,你的电子书,都在bookdown中我们讲述了bookdown用于自动化文档生成。里面涉及到一个文件Rproj用于项目管理。 本身是一个很简单的文件,里面的内容一般不需要修改,只是放置在每个项目目录下即可。 比如我们有个内容…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界! 博主主页传送门:Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦! 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述:随机输入浮点数,输出四舍五入后的整数…

数据链路层简单介绍

mac地址(物理地址) mac地址和ip地址,目的都是为了区分网络上的不同设备的,在最开始的时候,mac地址和ip地址是两伙人,独立各自提出的,ip地址是4个字节(早都不够用了)&…

OFDM 802.11a的FPGA实现(二十一)发射主控模块MCU(含代码)

目录 1.前言 2.主控逻辑 3.Matlab 4.verilog 5.ModelSim 6.ModelSim仿真结构与Matlab自动化对比 完整工程链接(含verilog和Matlab代码): https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkxNjM0NDk2Nw&actiongetalbum&album…

Spring6笔记(五):国际化、数据校验、提前编译

九、国际化:i18n 9.1 i18n概述 9.2 Java国际化 9.3 Spring6国际化 十、数据校验:Validation 10.1 Spring Validation 概述 10.2 实验一:通过 validator 接口实现 10.3 实验三:Bean Validation 注解 10.4 实验四:实现…

鸿蒙 DevEcoStudio:通知栏通知实现

【使用notificationManager实现通知栏功能】 【普通通知、长文本通知、多行通知、图片通知】 import notificationManager from ohos.notificationManager import image from ohos.multimedia.image Entry Component struct Index {State message: string Hello World// 将图…

html5 笔记01

01 表单类型和属性 input的type属性 单行文本框: typetext 电子邮箱 : typeemail 地址路径 : type url 定义用于输入数字的字段: typenumber 手机号码: typetel 搜索框 : typesearch 定义颜色选择器 : typecolor 滑块控件 : typerange 定义日期 :typedate 定义输入时间的控件…

04-Json/Ajax/Vue的知识

1. Json结构 1.1 Json概述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,实现数据前后端交互。 它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天,越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长,对智能算力的需求也不断增强。为应对新的市场趋势,英码科技凭借自身的硬件研发优势,携手算能相继推出了基于BM1684的边缘计算盒…

5.23.1 深度学习在乳腺癌成像中的应用

乳腺成像在早期发现乳腺癌以及在治疗期间监测和评估乳腺癌方面发挥着重要作用。最常用的乳腺成像方式是数字乳房X线摄影、数字乳腺断层合成、超声和磁共振成像。 传统的 CAD 系统基于传统的机器学习 (ML) 技术;预定义(手工制作)的特征是系统…

【堡垒机小知识】堡垒机和接口机的重要区别分析

在企业IT架构管理中,接口机和堡垒机各自扮演着不可或缺的角色。但不少IT小伙伴对于两者不是很了解,不知道两者之间有什么区别,今天我们就来一起分析一下。 堡垒机和接口机的重要区别分析 1、功能区别 接口机主要用于数据库层面的数据交换和…

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…

Unity数据持久化2——XML

简介: 基础知识 XML文件格式 XML基本语法 XML属性 练习: C#读取存储XML XML文件存放位置 读取XML文件 练习: 存储修改XML文件 练习: 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

第八课,分支语句嵌套、随机数函数、初识while循环

一,分支结构的嵌套语法 在 Python 中,分支结构可以嵌套,这意味着你可以在一个条件语句中包含另一个条件语句。嵌套的分支结构可以让你更灵活地控制程序的逻辑流程。 怎么理解呢?打个比方:放学后,请三年级…

【MySQL精通之路】MySQL8.0新增功能-原子DDL语句支持

太长不看系列: 本文一句话总结,MySQL8.0支持多条DDL语句执行时的原子性了(仅限Innodb) 本文属于下面这篇博客的子博客: 【MySQL精通之路】MySQL8.0官方文档-新增功能 1.意义描述 MySQL 8.0支持原子数据定义语言&…

知乎广告推广开户最低需要多少钱?

精准高效的广告推广,是企业成功的关键,知乎作为知识分享与交流的高端平台,汇聚了大量高质量用户群体,无疑是品牌传播与产品推广的黄金之地。云衔科技作为您数字营销旅程中的得力伙伴,正以专业的知乎广告开户及代运营服…

快速搭建本地全文搜索

MeiliSearch 说起全文检索,在项目开发中,用的最多的就是 ElaticSearch 了,ElaticSearch 是基于 Apache Lucene 开发的全文检索服务,是一个端到端的解决方案,因此,部署和维护都非常复杂。今天介绍的这个全文…

如何在go项目中实现发送邮箱验证码、邮箱+验证码登录

前期准备 GoLand :2024.1.1 下载官网:https://www.jetbrains.com/zh-cn/go/download/other.html Postman: 下载官网:https://www.postman.com/downloads/ 效果图(使用Postman) Google: QQ: And …

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍:create-vue是Vue官方提供的最新的脚手架工具,用于快速生成一个工程化的Vue项目create-vue提供如下功能: 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境:NodeJS 安装NodeJS 一、 创建vue工程 npm 类…

自定义横向思维导图,横向组织架构图,横向树图。可以自定义节点颜色,样式,还可以导出为图片

最近公司设计要求根据目录结构,横向展示。所以做了一个横向的思维导图,横向的树结构,横向的组织架构图,可以自定义节点颜色,样式,还可以导出为图片 话不多说,直接上图片,这个就是一…