SQL 语言:完整性约束

news/2024/7/22 13:26:19/文章来源:https://blog.csdn.net/weixin_50357986/article/details/139247028

文章目录

    • 概述
    • 主键 ( Primary Key ) 约束
    • 外键(Foreign Key)约束
    • 属性值上的约束
    • 全局约束
    • 总结

概述

数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据库中数据是正确的,避免非法的更新。数据库完整性重点需要掌握的内容有:完整性约束条件的分类、完整性控制应具备的功能。

完整性约束类别大概分为实体完整性约束、参照完整性约束、自定义完整性约束三类。

  • 实体完整性约束:非空值约束(NOT NULL)、默认值(DEFAULT)、唯一性约束(UNIQUE、UNIQUE(列名))、主键约束(PRIMARY KEY 、PRIMARY KEY(列名))。
  • 参照完整性约束:外键约束(REFERENCES 表名(列)、FOREIGN KEY(列名) REFERENCES 表名(列))。
  • 自定义完整性约束:约束表达式(CHECK)。

其中,非空值约束和默认值只有列级完整性约束;唯一性约束、主键约束、外键约束、CHECK 有表级和列级完整性约束。

主键 ( Primary Key ) 约束

完整性约束条件作用的对象有关系、元祖、列三种,又分静态和动态,共分为六类:

image

在关系中只能有一个主键。声明主键有两种方法:

  1. 将 PRIMARY KEY 保留字加在属性类型之后(列级完整性约束)。
  2. 在属性列表中引入新元素,该元素包含保留字 PRMARY KEY和利用圆括号括起形成该键的属性或属性组列表(表级完整性约束)。

当主键有多个属性时必须用方法2,表级完整性约束。

示例1. 学生关系Students(Sno,Sname,Sex,Sdept,Sage)的主键是Sno,在创建学生关系时可使用PRIMARYKEY进行实体完整性约束。创建学生表的SQL语句如下:

CREATE TABLE Students
(Sno CHAR(8),Sname CHAR(10),Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3),PRIMARY KEY(Sno)
);

外键(Foreign Key)约束

参照完整性定义语法如下:

FOREIGN KEY (属性名) REFERENCES 表名(属性名)
[ON DELETE [CASCADE|SET NULL]

关键字说明:FOREIGN KEY 定义哪些列为外码;REFERENCES 指明外码对应于哪个表的主码;ON DELETE CASCADE 指明删除被参照关系的元组时,同时删除参照关系中的元组;SET NULL 表示置为空值方式。

示例2. 对于示例5学生选课关系SC(Sno, Cno, Grade)中,学号Sno 参照关系Students, 课程号Cno 参照关系C。因此完整的语句为:

CREATE TABLE SC
(Sno CHAR(8),Cno CHAR(4),Grade NUMBER(3),PRIMARY KEY(Sno),PRIMARY KEY(Cno),FOREIGN KEY Sno REFERENCES Students(Sno),FOREIGN KEY Cno REFERENCES C(Cno)
);

属性值上的约束

属性值上的约束可以通过 NOT NULL、UNIQUE 和 CHECK 进行:

  • NOT NULL:在 SQL 中,NULL 值是所有域的成员,也是每个属性默认的合法值。但是,根据用户要求有些属性不允许取空值,此时可用“NOT NULL”进行约束。例如,银行的账户关系Account(Account-no, branch-name, balance)不允许余额balance取空值,此时可用“balance numeric(12,2) not null” 进行约束,即禁止在该属性上插入一个空值。
  • UNIQUE:唯一标识数据库表中的每条记录。
  • CHECK:CHECK 子句可用于保证属性值满足指定的条件,条件与 where 类似。例如,银行关系 Branch (branch-name,branch-city,assets) 要求资产 assets 不能为负值 ,此时可用“CHECK (assets >=0)”进行约束。

示例3. 学生关系Students(Sno,Sname,Sex,Sdept,Sage),假设用户要求学生姓名不能为空,男生的年龄为1525岁,女生的年龄为1523岁。那么可使用如下语句创建表:

CREATE TABLE Students
(Sno CHAR(8),Sname CHAR(10) NOT NULL,Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3),PRIMARY KEY(Sno),CHECK (Sage >= 15AND ((Sex = 'M' AND Sage <= 25)OR (Sex = 'F' AND Sage <= 23))
);

全局约束

全局约束是指一些比较复杂的完整性约束,这些约束涉及多个属性间的联系或多个不同关系间的联系。

基于元组的检查子句和断言两种情况:

(1)基于元组的检查子句:这种约束是对单个关系的元组值加以约束。方法是在关系定义中的任何地方加上关键字 CHECK 和约束条件。

例如,年龄在16至20岁之间,可用 CHECK(Sage>=16 AND Sage<=20) 检测。

(2)基于断言的语法格式

格式

CREATE ASSERTION <断言名> CHECK(<条件>)

示例4. 教学数据库的模式Students、SC、C中创建一个约束ASSE-SC1:不允许男同学选修“张勇”老师的课。

CREATE ASSERTION ASSE_SC1 
CHECK (NOT EXISTS (SELECT * FROM SC WHERE Cno IN (SELECT Cno FROM C WHERE TEACHER = '张勇')AND Sno IN (SELECT Sno FROM Students WHERE SEX = 'M')));

示例9. 教学数据库的模式Students、SC、C中创建 一个约束ASSE_SC2;每门课最多允许50名男同学选修。

CREATE ASSERTION ASSE_SC2 
CHECK (50>=ALL(SELECT COUNT(SC.Sno)FROM Students,SCWHERE Students.Sno = SC.Sno AND SEX = 'M'GROUP BY Cno));

总结

SQL完整性约束是维护数据库中数据准确性和一致性的一组关键机制。通过应用这些约束,我们能够确保操作数据库时数据的有效性和业务的规范性得到维护。总结来说,SQL完整性约束对于任何数据库系统都是至关重要的,它们不仅仅保证了数据的质量和可信度,还提高了数据库的性能和安全性。作为数据库设计人员或开发者,合理地使用这些约束,可以在很大程度上避免数据的混乱和错误,提升整个系统的稳定性和可靠性。

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

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

相关文章

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员&#xff0c;在他们日常的安全审计和渗透测试工作中&#xff0c;有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术&#xff0c;可以有效地在复杂的现代化…

已解决SyntaxError: EOL while scanning string literal 亲测有效!!!

已解决SyntaxError: EOL while scanning string literal 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 当你在编写Python代码时&#xff0c;可能会遇到以下报错信息&#xff1a; SyntaxError: EOL while scanning string liter…

如何搭建springBoot项目中的全局异常处理和自定义异常处理

目录 1 什么是异常 2 异常的种类 3 解决异常的方式 4 全局异常处理器和自定义异常处理器 5 测试异常处理 1 什么是异常 异常&#xff08;Exception&#xff09;是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因…

JUC框架-并发容器源码详解

文章目录 并发容器ConcurrentHashMapJDK 1.7 及之前的实现原理JDK 1.8 及之后的实现原理 CopyOnWriteArrayList & CopyOnWriteArraySet工作原理&#xff08;附源码&#xff09;特点适用场景 ConcurrentLinkedQueue数据结构入队列操作ConcurrentLinkedQueue 特性ConcurrentL…

LED屏控制卡是如何控制LED屏的?

LED屏控制卡是LED显示屏的关键组件之一&#xff0c;负责将输入的画面信息转换为LED屏能够显示的数据和控制信号。以下是LED屏控制卡的工作原理和功能的详细介绍&#xff1a; 1. LED显示屏控制器概述&#xff1a; LED显示屏控制器是LED显示屏的核心部件之一&#xff0c;也称为LE…

剪画小程序:自媒体创作的第一步:如何将视频中的文案提取出来?

自媒体创作第一步&#xff0c;文案提取无疑是至关重要的一环。 做自媒体之所以要进行文案提取&#xff0c;有以下重要原因&#xff1a; 首先&#xff0c;提高效率。通过文案提取&#xff0c;可以快速获取关键信息&#xff0c;避免在无关紧要的内容上浪费时间&#xff0c;从而…

685. 冗余连接 II

685. 冗余连接 II 问题描述 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。 输入一个有向图&#xff0c;该…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

基础—SQL—DML(数据操作语言)插入数据

一、介绍 分类全称说明DMLData Manipulation Language数据操作语言。用来对数据库表中的数据进行增删改(插入、删除、修改) 则增、删、改是三个操作也就对应着三个关键字&#xff0c;分别是&#xff1a; 添加数据&#xff1a;&#xff08; INSERT &#xff09;修改数据&#…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下&#xff0c;想要让监控或传感器等设备联网&#xff0c;仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用&#xff1a; 物联网应用场景 …

LeetCode115:不同的子序列

题目描述 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 代码 /*dp[i][j]&#xff1a;以i为结尾的s中有以j为尾的t的个数递推公式&#xff1a;当s[i - 1] 与 t[j - 1]相等时&#xff0c;dp[i][j]可以有两…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新闻资讯 的设计与实现

一.项目介绍 本系统分为 后端 和 小程序端 后端&#xff1a;点击登录按钮 设置个人中心、 管理员账号数据维护、 基础数据维护、 短视频信息维护(包括查看短视频留言、短视频收藏)、 论坛维护(增删改查帖子信息&#xff0c;包括查…

uniapp微信小程序的单项选择器大小颜色的修改

问题描述&#xff1a;需要修改radio的大小和颜色&#xff0c;组件官网radio-group | uni-app官网 修改radio颜色 直接使用color属性就行了 eg. <label class"agree_label"><radio class"agree_radio" value"" click"setuserAgr…

蓝桥杯第十四届国赛B组刷题笔记

A-0子2023&#xff1a; 题目&#xff1a; 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; &#x1d446;12345678910111213...20222023S12345678910111213...20222023。 小蓝想知道 &#x1d446;S 中有多少种子序列恰好等…

OneForall工具的下载安装和使用(Windows和Linux)

目录 OneForall的介绍 OneForall的下载 OneForall的安装 安装要求 安装步骤&#xff08;git 版&#xff09; 安装&#xff08;kali&#xff09; OneForall的使用命令 在Windows 在Linux&#xff08;kali&#xff09; OneForall的结果说明 免责声明 本文所提供的文字和…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

逆向基础:软件手动脱壳技术入门

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过的程序可以直接运行&#xff0c;但是不能查看源代码…

内网权限提升

打点进入内网中&#xff0c;权限一般为 web 服务的权限 1、什么是提权 一般一来说是低权限用户去申请高权限用户&#xff0c;可以是&#xff08;配置不当、溢出类漏洞&#xff08;历史漏洞&#xff09;、本地漏洞&#xff09; 2、常见用户分类 windows&#xff1a; 本地登录…