数据完整性与约束的分类

news2025/4/21 15:39:23

一、引言

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

(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进行修改,如果原本存在其他约束例如非空约束,需要保留写下,否则视为删除。

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

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

相关文章

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…

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文件…

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

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

CF 278A.Circle Line

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

本地部署deepseek简单教程

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

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…

Mysql基于binlog主从同步配置

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

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘,占用空间太大了,想给安装到其他盘,网上找了半天的都不对 正确安装命令: 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 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…

go语言中的反射

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

JUC学习笔记02

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

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

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

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

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

飞算JavaAI :AI + 时代下的行业趋势引领者与推动者

在科技飞速发展的当下,AI 时代正以前所未有的速度重塑着各个行业的格局,而软件开发领域更是这场变革的前沿阵地。在众多创新力量之中,飞算JavaAI 脱颖而出,宛如一颗璀璨的新星,凭借其独树一帜的特性与强大功能&#x…

【重新认识C语言----结构体篇】

目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体? 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…

一种解决SoC总线功能验证完备性的技术

1. 前言 通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势,也是缩短芯片开发周期,抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上,而且各IP的地址空间分配是否正确,是一件很棘手的事情。本文提出了一种新…

【Linux系统】线程:线程库 / 线程栈 / 线程库源码阅读学习

一、线程库 1、线程库介绍:命名与设计 命名:线程库通常根据其实现目的和平台特性进行命名。例如,POSIX标准定义了Pthreads(POSIX Threads),这是一个广泛使用的线程库规范,适用于多种操作系统。此…