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

news2024/11/24 17:50:17

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

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.coloradmin.cn/o/1689582.html

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

相关文章

Leetcode刷题2

文章目录 前言寻找两个正序数组的中位数1️⃣ 双指针快速排序2️⃣ 第k小数解法 Z 字形变换1️⃣ 个人解法2️⃣巧妙解法13️⃣巧妙解法2 字符串转换整数 (atoi)1️⃣ 常规方法2️⃣ 作弊方法😫 整数转罗马数字1️⃣ 常规方法:按照给定规则写出判断条件即…

Python使用thread模块实现多线程

介绍: 线程(Threads)是操作系统提供的一种轻量级的执行单元,可以在一个进程内并发执行多个任务。每个线程都有自己的执行上下文,包括栈、寄存器和程序计数器。 在Python中,可以使用threading模块创建和管理…

Mybatis源码剖析---第一讲

Mybatis源码剖析 基础环境搭建 JDK8 Maven3.6.3&#xff08;别的版本也可以…&#xff09; MySQL 8.0.28 --> MySQL 8 Mybatis 3.4.6 准备jar&#xff0c;准备数据库数据 把依赖导入pom.xml中 <properties><project.build.sourceEncoding>UTF-8</p…

面试问题小结

说说你的项目&#xff0c;从里面学到啥了&#xff08;随便说&#xff09; CAS 线程池 的各个方面 线程咋创建&#xff08;4种方式&#xff09; 说一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B树中咋存储的&#xff08;类似下面的图&#xff0c;变通一下就行了&a…

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…

k8s集群部署成功后某个节点突然出现notready状态解决办法

通过&#xff1a; kubectl get nodes 查看master1节点为not ready 通过查看日志&#xff1a; journalctl -f -u kubelet.service 看到这里 查看状态&#xff1a; systemctl status kubelet.service 重启一样会报错 执行&#xff1a; swapoff -a 执行后&#xff0c;重启…

行业首发 | MS08067-SecGPT(送邀请码)

一、简介 MS08067-SecGPT基于LLM大模型技术专门为网络安全领域设计的智能助手&#xff0c;集问答、分析、工具为一体的对话式安全专家&#xff0c;支持可以创建多会话问答。目的是辅助用户完成网络安全相关的工作&#xff0c;学员通过问答方式体验到SecGPT所具备的威胁情报分…

查看目录或文件的磁盘使用情况

在排查问题过程中&#xff0c;会遇到磁盘占满&#xff0c;需要排查具体哪个文件占用比较大&#xff0c;此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括&#xff1a; -h 或 --human-readable&#xff1a;以人类可读的格式&#xff08;如 K、M、G&#xff09;…

机器学习第四十周周报 WDN GGNN

文章目录 week40 WDN GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 问题提出3.2 GNN3.3 CSI GGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据获取4.3.2 参数设置4.3.3 实验结果 5. 结论二、GGNN1. 代码解释2. 网络结构小结参考文献参考文…

汉明码(海明码)的计算的规则

一.汉明码的由来 1.汉明码&#xff08;Hamming Code&#xff09;&#xff0c;是在电信领域的一种线性调试码&#xff0c;以发明者理查德卫斯里汉明的名字命名。汉明码在传输的消息流中插入验证码&#xff0c;当计算机存储或移动数据时&#xff0c;可能会产生数据位错误&#x…

mdm 推送证书制作教程

第一步点击获取&#xff0c;点击以后会下载一个zip压缩包 解压以后&#xff1a;会得到四个文件&#xff0c;请务必保存好&#xff0c;待会需要使用 登录apple开发者官网 https://developer.apple.com/account/resources/certificates/list 点击添加证书 找到mdm csr 然后点击…

Python | Leetcode Python题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsequeue1 collections.deque([p])queue2 collections.deque([q])while queue1 and queue2:node…

在Windows上创建RAM Disk

在Windows 10上创建一个与Linux中的tmpfs相似的内存文件系统&#xff08;一个文件系统&#xff0c;它使用主内存作为存储&#xff09;通常不是操作系统直接提供的功能。不过&#xff0c;有一些方法可以实现类似的效果。 使用软件创建RAM Disk 有一些第三方软件可以帮助在Wind…

crmeb Pro版/多店版商城付费会员、会员卡功能说明

一、功能介绍 用户开通付费会员后&#xff0c;可获得多项商城优惠&#xff0c;商家可通过此功能锁定重要客户&#xff0c;培养客户消费习惯等 二、操作流程 用户 &#xff1e; 会员管理 &#xff1e; 付费会员 三、功能说明 会员类型 付费卡类型&#xff1a;月卡、季卡、年卡…

集合框框框地架

这一次来介绍一下常用的集合&#xff1a; 首先是两种集合的《家庭系谱图》&#xff1a; 接下来介绍一下集合的种类&#xff1a; Collection Set SetTreeSet&#xff1a;基于红⿊树实现&#xff0c;⽀持有序性操作&#xff0c;例如&#xff1a;根据⼀个范围查找元素的操作。但…

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃&#xff0c;其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性&#xff0c;使其能够无缝处理和生成文本、音频…

基于灰狼优化算法优化支持向量机(GWO-SVM)时序预测

代码原理及流程 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的时序预测代码的原理和流程如下&#xff1a; 1. **数据准备**&#xff1a;准备时序预测的数据集&#xff0c;将数据集按照时间顺序划分为训练集和测试集。 2. **初始化灰狼群体和SVM模型参数…

机器学习云环境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下载对应版本的 OBS Broswer 软件&#xff0c;如图&#xff0c;红框内的为安装文件&#xff0c;蓝色框内的为对应安装文件的校验文件&#xff08;无需下载&#xff09; 以 64 位机为例&#xff0c;下载完…

1.OLED

1.基础知识

【Docker系列】 Docker容器具体信息查询

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…