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

数据完整性与约束的分类

一、引言

为什么需要约束?为了保证数据的完整性。

(1)数据完整性

数据完整性指的是数据的精确性和可靠性。

为了保证数据的完整性,SQL对表数据进行额外的条件限制,从以下四方面考虑:

①实体完整性:同一张表中不能出现完全不能区分的记录

②域完整性:存在范围,不能无限

③引用完整性:引用的对象应当存在

④用户自定义完整性:例如密码不为空

二、约束

(1)什么是约束

约束是表级的强制规定。

理解为对表中字段的限制

可以再=在创建表时规定约束(通过CREATE TABLE语句),或者在表创建之后,通过ALTER TABLE语句规定约束。

(2)约束的分类

①根据角度分类

单列约束与多列约束

②根据作用范围

列级约束(声明在对应字段之后)与表级约束(在所有字段之后)

③根据功能

非空约束(not null)

唯一性约束(unique)

主键约束(primary key)

外键约束(forengn key)

检查约束(check)

默认值约束(default)

(3)约束的添加

CREATE TABLE时添加约束

ALTER TABLE 时增加约束、删除约束

三、约束的具体讲解

(1)非空约束 NOT NULL

特点:限制某个字段/某列的值不能为空

注意:

①非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空

②一张表可以有多个列分别限定了非空

③空字符串不等于NULL,0也不等于NULL

举例:

NOT NULL只能使用列级约束,声明在对应的字段之后。

NOT NULL非空约束修饰的字段,不能写入NULL,(在没有设置默认值的情况下)默认值为NULL,所以也不能 不写入数据。

修改约束的时候,要注意修改之后的约束与表中已经存在的数据不能相悖,否则修改失败。

(2)唯一性约束 UNIQUE

特点:限制某个字段,不允许重复

①CREATE TABLE创建表时指明唯一性约束

唯一性约束可以直接在数据类型之后加上UNIQUE,但是如果需要对约束进行命名,则:

创建表时,最后一行写入:

CONSTRAINT 约束名 约束类型(被约束的字段)

举例:

创建唯一约束的时候,如果不给唯一约束命名,默认与列名相同。

②在ALTER TABLE修改表内容的时候,添加唯一约束

ALTER TABLE 表名

ADD UNIQUE(字段名);

也可以使用MODIFY的方式

ALTER TABLE 表名

MODIFY 字段名 数据类型(长度)UNIQUE

如果需要自主为约束命名,则:

ALTER TABLE 表名

ADD CONSTRAINT 约束名 UNIQUE(字段名);

举例:

③对唯一性数据进行插入

受到唯一性约束的数据不允许重复。

但如果写入NULL,可以重复添加NULL。

④复合的唯一性约束

同时约束两个字段,此时只有两个字段同时相等时,才判定为’不唯一‘进行报错。

⑤删除唯一性约束

ALTER TABLE 表名

DROP INDEX 唯一索引名

(唯一索引名即为约束名,可以是自主起名,默认则为列名。)

添加唯一性约束的列上回自动创建唯一索引

删除唯一约束只能通过删除唯一索引

删除时需要指定唯一索引名,唯一索引名和唯一约束名一样

如果创建唯一约束没有进行取名,则默认使用列名作为唯一索引名。

(3)主键约束 PRIMARY KEY

特点;唯一约束+非空约束

注意:

一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。

②主键约束对应着表中的一列或者多列(复合主键)

③如果是多列组合的复合主键约束,这些列都不允许为空值,且组合的值不允许重复

MySQL主键名总是PRIMARY,就算自己命名了主键约束名也没用

⑤当创建主键约束时,系统会默认在所在的列或列组合上建立对应的主键索引

⑥不要修改主键字段的值,因为主键是数据记录的唯一标识,如果修改了主键的值,有可能会破坏数据的完整性

①创建主键约束

创建主键约束一般在创建表的时候就完成创建。

可以直接在字段后添加PRIMARY KEY

也可以在CREATE TABLE的最后一行加上

PRIMARY KEY(字段)

等价于

MySQL中,修改表时也能够添加主键约束,但是不推荐。

ALTER TABLE 表名

ADD PRIMARY KEY(字段名)

或者使用MODIFY。

②复合主键约束

CREATE TABLE 表名(

字段名 数据类型,

字段名 数据类型,

…,

PRIMARY KEY(字段1,字段2)

);

表示字段1,字段2的组合唯一,且字段1与字段2都非空。

只要有一个字段为NULL,操作失败。

③删除主键约束 (实际开发中用不到。)

ALTER TABLE 表名

DROP PRIMARY KEY

(4)自增列 AUTO_INCREMENT

作用:某个字段的值自增

特点和要求:

一张表最多只能有一个自增列

②当需要产生唯一标识符或顺序值时,可设置自增

③自增长列约束的列必须是键列

④自增约束的列的数据类型必须是整数类型

⑤如果自增列指定了0和NULL,会在当前最大值的基础上自增;如果自增列手动制定了具体值,直接赋值为具体值。

开发中,一旦主键作用的字段上声明有AUTO_INCREMENT,则添加数据时,不给对应字段赋值。

①创建自增列

创建主键同时指明自增列

已有主键时添加AUTO_INCREMENT

②删除自增列

ALTER TABLE 表名

MODIFY 字段名 字段类型;

③MySQL8.0新特性:自增列的持久化

即使删除了已经创建的自增列的数据,并且重启MySQL,仍然从已经创建的自增列数据开始向后偏移,而不是从表中已有的数据开始向后偏移。

(5)外键约束 FOREIGN KEY

作用:限定某张表的某个字段的完整性

主表:被引用的表

从表:引用别人的表

特点:

-1-  被引用的数据应当是唯一的

-2-  如果不给外键约束命名,会自动产生一个外键名

-3-  应当先创建主表

-4-  应当先删除从表

-5-  从表中指定外键约束,一个表可以建立多个外键约束

-6-  从表的外键列与主表被参照的列名可以不相同,但是数据类型必须一致,逻辑意义一致

-7-  创建外键约束时,系统默认会在所在列上建立对应的普通索引。索引名是列名,不是外键的约束名

-8- 删除外键约束后,必须手动删除对应的索引

书写格式:

主表正常书写。

CREATE TABLE 表名(

字段 数据类型 约束声明,

字段 数据类型 约束声明,

……)

从表:

CREATE TABLE 表名(

字段 数据类型 约束声明,

字段 数据类型 约束声明,

……,

CONSTRAINT 外键约束名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表对应的字段))

或者,在两张表书写完成之后,通过ALTER TABLE的方式,添加外键约束。

书写格式:

ALTER TABLE 表名

ADD CONSTRAINT 外键约束名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表对应的字段);

举例:

约束等级

Cascade:父表上更新与删除,子表同步更新

Set null:父表上更新与删除,子表对应字段更新为NULL

No action/Restrict:如果子表有匹配的记录,不允许父表进行更新与删除(默认)

ON UPDATE CASCODE ON DELETE SET NULL

ON UPDATE CASCODE ON DELETE RESTRICT

(写在从表最后一行外键约束之后)

删除外键约束

ALTER TABLE 表名

DROP FOREIGN KEY 外键约束名

再手动删除外键约束对应的普通索引

SHOW INDEX FROM 表名称; #查看某个表的索引名

ALTER TABLE 表名

DROP INDEX 外键约束名。

小结:因为应用层面需保证完整性,在MySQL中允许使用但不推荐。

MySQL中,外键约束有成本,消耗系统资源。

外键和级联适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险,外键影响数据库的插入速度。

(6)检查约束CHECK

作用:检查输入的数据是否符合要求

MySQL5.7不支持CHECK约束,但是MySQL8.0支持。

 

(7)默认值约束 DEFAULT

作用:提供默认值

建表时提供默认值约束:

对已有的表的字段修改默认值约束:

需要注意,此时使用MODIFY进行修改,如果原本存在其他约束例如非空约束,需要保留写下,否则视为删除。

相关文章:

数据完整性与约束的分类

一、引言 为什么需要约束?为了保证数据的完整性。 (1)数据完整性 数据完整性指的是数据的精确性和可靠性。 为了保证数据的完整性,SQL对表数据进行额外的条件限制,从以下四方面考虑: ①实体完整性&…...

docker安装nacos2.x

本文为单机模式,非集群教程,埋坑 nacos2.x官方强制条件 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 64 bit JDK 1.8 Maven 3.2.x 环境介绍 centos 7 maven 3.9.9 jdk 17 nacos 2.3.1 1. 拉取docker镜像 d…...

git代理设置

在 Git 中,可以通过以下命令查看当前设置的代理配置: 查看 HTTP 代理 git config --get http.proxy查看 HTTPS 代理 git config --get https.proxy查看全局代理设置 如果你设置了全局代理,可以通过以下命令查看: git config …...

python编程-内置函数bin(),bool(),abs() ,all(),any(),ascii(),max(),min() 详解

1、bin()函数用于将整数转换为其二进制字符串表示。并返回一个以0b开头的字符串,表示该整数的二进制形式。 # 十进制数转换为二进制字符串 decimal_number 42 binary_string bin(decimal_number) print(f"Decimal {decimal_number} is {binary_string} in b…...

GB/T28181 开源日记[8]:国标开发速知速会

服务端源代码 github.com/gowvp/gb28181 前端源代码 github.com/gowvp/gb28181_web 介绍 go wvp 是 Go 语言实现的开源 GB28181 解决方案,基于GB28181-2022标准实现的网络视频平台,支持 rtmp/rtsp,客户端支持网页版本和安卓 App。支持rts…...

6 maven工具的使用、maven项目中使用日志

文章目录 前言一、maven:一款管理和构建java项目的工具1 基本概念2 maven的安装与配置(1)maven的安装(2)IDEA集成Maven配置当前项目工程设置 maven全局设置 (3)创建一个maven项目 3 pom.xml文件…...

js滚动到页面最底部

setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...

Node.js包管理工具npm

目录 什么是 npm npm 主要功能 安装配置 npm 环境 package.json 版本范围规则 使用 npm npm 版本和帮助命令 npm 包相关命令 安装包 卸载包 升级第三方包 升级自己开发的包 查看已安装的包 清除缓存和修复 package.json 相关 运行命令脚本 全局配置 npm 包发布…...

基本数据结构--平衡二叉搜索树之红黑树示例代码

红黑树的规则。红黑树的每个节点有颜色(红或黑),满足以下性质: 每个节点是红或黑。根节点是黑的。叶子节点(NIL节点)是黑的。红节点的子节点必须是黑的。从任一节点到其所有后代叶子节点的路径包含相同数量…...

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览: 国家标准|GB/T 43698-2024 相关标准: &a…...

Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项

1. map(function, iterable, ...) 功能:对可迭代对象中的每个元素应用指定函数,返回一个迭代器。 参数: function:要执行的函数(可以是lambda表达式)。 iterable:一个或多个可迭代对象&#x…...

CF 278A.Circle Line

题目分析 输入n个数据作为路径,求从a到b的最短距离,需要将其相成一个圆圈,既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组,通过下标进行操作,既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

本地部署deepseek简单教程

部署deepseek,首先需要知道deepseek官网地址:DeepSeek 第一步:Ollama 去ollama下载对应的版本,我的电脑是window 在这里可以看到关于deepseek相关 第二步,下载完ollama无脑下一步就可以 这样属于安装成功 第三步&…...

3.1 可视化算子编程语言

HuggingFists的VO编程语言与常见的其它编程语言有一定的区别。其语言由两种不同的语法特征构成。一部分以可视化算子作为语法基础(简称:VO-O),辅助使用者可视化的完成数据处理/分析流程的编写;一部分采用表达式语法(简称:VO-E)&am…...

UnityShader学习笔记——多种光源

——内容源自唐老狮的shader课程 目录 1.光源类型 2.判断光源类型 2.1.在哪判断 2.2.如何判断 3.光照衰减 3.1.基本概念 3.2.unity中的光照衰减 3.3.光源空间变换矩阵 4.点光源衰减计算 5.聚光灯衰减计算 5.1.聚光灯的cookie(灯光遮罩) 5.2.聚…...

电脑右下角小喇叭没反应怎么回事,快速解决方案

当电脑右下角的小喇叭(音量图标)没有反应时,可以尝试以下快速解决方案: 一、基础检查与操作 检查键盘音量键: 按下键盘上的音量增加或减少键,或尝试Fn音量键(部分笔记本需组合键)&a…...

chrome-base 如何实现一个BindOnce

考虑一个问题: worker_thread.task_runner()->PostDelayedTask(FROM_HERE, base::BindOnce(&Ref::Foo, ref, 1), base::Milliseconds(1000)); BindOnce 是如何实现的呢? 翻看源码:base\functional\bind.h 写的 非常简洁 // Bind a…...

HTML学习之CSS三种引入方式

HTML学习之CSS三种引入方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...

Mysql基于binlog主从同步配置

主配置&#xff1a; 修改配置文件&#xff1a;/etc/my.cnf 添加server-id1 重启MySQL服务&#xff1a;systemctl restart mysqld 创建用户并授权&#xff1a; mysql> create user rep192.168.79.% identified with mysql_native_password by 123456; Query OK, 0 rows aff…...

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘&#xff0c;占用空间太大了&#xff0c;想给安装到其他盘&#xff0c;网上找了半天的都不对 正确安装命令&#xff1a; start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…...

NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理

网关 OcelotGeteway 网关 Ocelot配置文件 {//单地址多实例负载均衡Consul 实现动态伸缩"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", &quo…...

ubuntu 本地部署deepseek r1 蒸馏模型

本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署&#xff1a;基于docker安装&#xff0c;且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线操作。它支持各种 LLM…...

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…...

旅行社项目展示微信小程序功能模块和开发流程

旅行社当前旅游线路的程序(微信小程序),旨在帮助旅行社更高效地管理线下活动预订,同时为客户提供便捷的报名和查看功能。适用于短途游、团队建设等活动,支持在线预订、缴费及订单管理,可根据用户需求定制更多个性化服务,为公司提升品牌知名度与客户体验。通过简洁明了的…...

JUC学习笔记02

文章目录 JUC笔记2练习题&#xff1a;手写线程池代码解释&#xff1a;AdvancedThreadPool 类&#xff1a;WorkerThread 内部类&#xff1a;AdvancedThreadPoolExample 类&#xff1a; 线程池的思考CPU密集型IO密集型 练习题&#xff1a;手写自动重试机练习题&#xff1a;手写定…...

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…...

python编程-类结构,lambda语法,原始字符串

一个类的基本结构包括以下部分&#xff1a; 类名&#xff1a;用来描述具有相同属性和方法的对象的集合。 属性&#xff1a;类变量或实例变量&#xff0c;用于处理类及其实例对象的相关数据。 方法&#xff1a;在类中定义的函数&#xff0c;用于执行特定操作。 构造器&#xff…...

C++:代码常见规范1

头文件包含 (1)先系统头文件&#xff0c;后用户头文件&#xff1a;这是一个良好的编程习惯。系统头文件通常包含标准库的定义&#xff0c;而用户头文件则包含项目特定的定义。将系统头文件放在前面可以避免因用户头文件中的定义与系统头文件冲突而导致的问题。 #include <…...

C++(进阶五)--STL--用一颗红黑树封装map和set

目录 1.红黑树源码&#xff08;简略版&#xff09; 2.模板参数的控制 3.红黑树的结点 4.迭代器的实现 正向迭代器 反向迭代器 5.set的模拟实现 6.map的模拟实现 7.封装完成后的代码 RBTree.h mymap.h myset.h 1.红黑树源码&#xff08;简略版&#xff09; 下面我们…...