数据完整性与约束的分类

一、引言

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

(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.mzph.cn/diannao/69298.shtml

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

相关文章

autMan奥特曼机器人-对接deepseek教程

一、安装插件ChatGPT 符合openai api协议的大模型均可使用此插件,包括chatgpt-4/chatgpt-3.5-turbo,可自定义服务地址和模型,指令:gpt,要求Python3.7以上,使用官方库https://github.com/openai/openai-pyt…

@[TOC](优先级队列(堆)) 【本节目标】 1. 掌握堆的概念及实现 2. 掌握 PriorityQueue 的使用

优先级队列(堆) 1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 【本节目…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 进程组 进程组的概念 当我们使用以下命令查与…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示(16:9)确定调整标题占位符置于图片右侧:内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的智能学习平台管理系(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的智能学习平台管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、…

Odoo免费开源ERP最佳业务实践:主生产计划概论

Odoo主生产计划(Master Production Schedule, MPS)是确定每一个具体产品在每一个具体时间段的生产计划。 文|开源智造Odoo亚太金牌服务 老杨 概述 Odoo是全球排名第一的免费开源ERP系统,以其强大的功能和模块化设计著称,适用于各…

TOTP实现Google Authenticator认证工具获取6位验证码

登录遇到Google认证怎么办? TOTP是什么?(Google Authenticator) TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,主要用于双因素身份验证。其核心原理是通过共享密钥和时间同步生成动态密码,具体步骤如下: 共享密钥:服务端与客户端预先共享一个…

@RequestBody与@ResponseBody:Spring数据处理的“翻译官”

在Spring中,RequestBody和ResponseBody注解就像是数据交换的“翻译官”。 1. RequestBody注解:它的作用就像是把客户端发来的“外语”翻译成Java对象。当我们发送一个HTTP请求到服务器时,请求体里通常包含了一些数据,这些数据可能…

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

一、引言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志: 网络爬虫学习:应用selenium从搜*狐搜…

LM Studio 部署本地大语言模型

一、下载安装 1.搜索:lm studio LM Studio - Discover, download, and run local LLMs 2.下载 3.安装 4.更改成中文 二、下载模型(软件内下载) 1.选择使用代理,否则无法下载 2.更改模型下载目录 默认下载位置 C:\Users\用户名\.lmstudio\models 3.搜…

基于知乎平台的“开源AI智能名片2 + 1链动模式S2B2C商城小程序”引流策略研究

摘要:本文聚焦于如何借助知乎平台的高权重及优质用户特性,对“开源AI智能名片2 1链动模式S2B2C商城小程序”进行有效引流。通过深入分析知乎平台的用户特点、引流规则,并结合具体的引流方法,旨在为相关项目在知乎平台实现高效用户…

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本,可以通过定时任务自动处理表空间不足的问题;但是之前那个脚本没有涵盖CDB模式下的PDB,这里将脚本做了一下更新,可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…

在 Navicat 17 中扩展 PostgreSQL 数据类型 | 创建自定义域

定义域 以适当的格式存储数据可以确保数据完整性,防止错误,优化性能,并通过实施验证规则和支持高效数据管理来维护系统间的一致性。基于这些原因,顶级关系数据库(如PostgreSQL)提供了多种数据类型。此外&a…

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。它会产生一个脚本文件,里面包含备份开始时,已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…

[Collection与数据结构] B树与B+树

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎃1.修改密码 -持久…

蓝桥杯小白打卡第二天

789. 数的范围 题目描述 给定一个按照升序排列的长度为 n n n 的整数数组,以及 q q q 个查询。 对于每个查询,返回一个元素 k k k 的起始位置和终止位置(位置从 0 0 0 开始计数)。 如果数组中不存在该元素,则返…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差,尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面: 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片,每个分片独立地计算聚合结果。由于数据在分…

电脑可以自己换显卡吗?怎么操作

电脑是否可以自己换显卡主要取决于电脑的类型(台式机或笔记本)以及电脑的硬件配置。以下是对这一问题的详细解答及操作步骤: 一、判断电脑是否支持更换显卡 台式机:大多数台式电脑都支持更换显卡。只要主板上有PCIe插槽&#xff…

element-plus+vue3前端如何根据name进行搜索查到符合条件的数据

界面如图&#xff0c;下面的区域是接口给的所有的&#xff0c;希望前端根据输入的内容自己去匹配。 我是使用的element-plusvue3ts的写法。 <el-input v-model"filters.region" placeholder"输入区域搜索" keyup"filterRegion(filters.region)&q…