SQL 语言:完整性约束

文章目录

    • 概述
    • 主键 ( 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 >= 15
					AND ((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,SC
							 WHERE Students.Sno = SC.Sno 
										 AND SEX = 'M'
							 GROUP BY Cno));

总结

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

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

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

相关文章

内网穿透初步探索实践

内网穿透初步 正常来说两台Linux设备只有在同一局域网下才可以进行互相的ssh远程登录 那么如果不在一个网段下&#xff0c;比方说一台在家里连着家里的WIFI&#xff0c;一台在学校连着实验室的WIFI&#xff0c;这种情况要想实现ssh远程登录则需要用到内网穿透 这就需要用到一…

单细胞 10X 和seurat对象学习

单细胞seurat数据的基础知识 rm(list ls()) library(Seurat) #注意这个报错 #Warning: Feature names cannot have underscores (_), replacing with dashes (-) folderslist.files(./,pattern[123]$) folders scList lapply(folders,function(folder){ CreateSeuratObject(…

弘君资本股市行情:股指预计保持震荡上扬格局 关注汽车、银行等板块

弘君资本指出&#xff0c;近期商场体现全体分化&#xff0c;指数层面上看&#xff0c;沪指一路震动上行&#xff0c;创出年内新高&#xff0c;创业板指和科创50指数体现相对较弱&#xff0c;依然是底部震动走势。从盘面体现上看&#xff0c;轮动依然是当时商场的主基调&#xf…

openEuler 22.03 LTS SP3源码编译部署OpenStack-Caracal遇到的问题解决

openEuler 22.03 LTS SP3源码编译部署OpenStack-Caracal遇到的问题解决 问题一 给路由设置外部网关后Status为DOWN&#xff08;使用的是OVN&#xff09;问题描述临时的解决办法永久解决办法&#xff08;修改源代码&#xff09; 问题二 分离卷一直显示分离中问题描述解决办法&am…

jQuery效果2

jQuery 一、属性操作1.内容2.列子&#xff0c;购物车模块-全选 二、内容文本值1.内容2.列子&#xff0c;增减商品和小记 三、元素操作(遍历&#xff0c;创建&#xff0c;删除&#xff0c;添加&#xff09;1.遍历2.例子&#xff0c;购物车模块&#xff0c;计算总件数和总额3.创建…

Power BI 使用Filter()函数完成类似子查询的筛选

1. 假如我们有两张表&#xff0c;如下图&#xff0c;以及它们的关联方式&#xff1a; tb_bursary.student_id tb_student.id 2. 我们想要实现这个逻辑&#xff0c;先找出tb_student里&#xff0c;sno最大的学生id&#xff0c;再根据查找出的学生id&#xff0c;找到tb_bursary…

文献分享《Microbiome and cancer》

人类微生物群构成了一个复杂的多王国群落&#xff0c;与宿主在多个身体部位共生相互作用。宿主-微生物群的相互作用影响多 种生理过程和各种多因素的疾病条件。在过去的十年中&#xff0c;微生物群落被认为会影响多种癌症类型的发展、进展、转移 形成和治疗反应。虽然微生物对癌…

【C++】set与map

目录 一、键值对 二、set 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set的修改 6. set的查找 三、map 1. map的模板参数列表 2. map的构造 3. map的迭代器 4. map的容量 5. map的修改 6. map的查找 一、键值对 用来表示具有一一对应关…

Pytorch深度学习实践笔记10(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

算法刷题day54:搜索(一)

目录 引言一、池塘计数二、城堡问题三、山峰和山谷四、迷宫问题五、武士风度的牛六、抓住那头牛七、矩阵距离八、魔板 引言 针对于蓝桥杯&#xff0c;搜索问题还是非常之重要的&#xff0c;在省赛前深知暴搜的重要性&#xff0c;所以提前先把提高课的搜索一章给看了&#xff0…

Kafka线上集群部署方案怎么做?no.6

专栏前面几期内容&#xff0c;我分别从Kafka的定位、版本的变迁以及功能的演进等几个方面循序渐进地梳理了Apache Kafka的发展脉络。通过这些内容&#xff0c;我希望你能清晰地了解Kafka是用来做什么的&#xff0c;以及在实际生产环境中该如何选择Kafka版本&#xff0c;更快地帮…

漫步者x1穷鬼耳机双耳断连

困扰了我两天&#xff0c;终于有时间解决这个问题了&#xff0c;查看了一堆都是别的型号。怎么没人用这个啥按键都没有的耳机QAQ&#xff0c;幸好给我找到了说明书&#xff0c;啊哈哈&#xff01; 说明书地址

OnlyFans使用过程中出现年龄验证,地址错误,支付失败,账户验证等问题的原因及解决办法

原文链接&#xff1a;OnlyFans 使用过程中出现年龄验证&#xff0c;地址错误&#xff0c;支付失败&#xff0c;账户验证等问题的解决方案 前言简述 OnlyFans主要以成人内容为主&#xff0c;是一个知名的付费订阅社交媒体分享平台。众多来自健身、音乐、艺术等领域的内容创作者…

OrangePi KunPengPro | 开发板开箱测评之学习与使用

OrangePi KunPengPro | 开发板开箱测评之学习与使用 时间&#xff1a;2024年5月23日20:51:12 文章目录 OrangePi KunPengPro | 开发板开箱测评之学习与使用概述1.参考2.资料、工具3.使用3-1.通过串口登录系统3-2.通过SSH登录系统3-3.安装交叉编译工具链3-4.复制文件到设备3-5.第…

linux下宝塔负载100%解决方法

今天发现服务器宝塔面板负载居然是100% 但是cpu 和内存其实并不高 通过命令查看主机 uptime 中load average 居然高达18.23 看来负载是真的高了 通过vmstat 看看具体问题 procs&#xff1a; ​ r 表示运行和等待CPU时间片的进程数&#xff0c;这个值如果长期大于系统CPU个数…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始&#xff0c;内循环从height.size()-1开始去计算每一个值是可以的&#xff0c;但是因为数据量太大&#xff0c;会超时。 2.考虑到超时&#xff0c;需要优化一些&#xff0c;比如第一个选下标1&#xff0c;第二个选下标3和第一个选下…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具&#xff0c;它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接&#xff0c;方便企业更加快捷地以金山多维表格为数据源&#xff0c;制作出可以实时更…

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

7个靠谱的副业赚钱方法,个个都可以月入过万!宝妈,上班族,学生党都可以做的兼职副业

你是不是也有过这样的困扰&#xff0c;生活费不够用&#xff0c;想要找个兼职贴补家用或者满足自己的小欲望&#xff1f;今天&#xff0c;我就带你一起走进这个五彩斑斓的兼职世界&#xff0c;让你轻松实现月入过千的小目标&#xff01; 在我多年的兼职探险历程中&#xff0c;我…

关于DDos防御...别在听别人瞎扯了.....

前言 无意间刷文章的时候看到一篇文章&#xff0c;写的是遇到ddos&#xff0c;怎么用iptables封IP....... 然后我就百度搜了一下&#xff0c;好多都是这么说的&#xff0c;但是我发现&#xff0c;大多数人只要遭受过长期Ddos的&#xff0c;就不会再信网上的文章 文笔不太好&…