文章目录

  • 实体完整性
    • 定义实体完整性
    • 实体完整性检查和违约处理
  • 参照完整性
    • 定义参照完整性
    • 参照完整性检查和违约处理
  • 用户定义的完整性
    • 属性上约束条件的定义
      • 不允许取空值
      • 列值唯一
      • 用CHECK短语指定列值应该满足的条件
    • 元组上的约束条件
  • 完整性约束命名子句
    • 完整性约束命名子句
    • 修改表中的完整性限制
  • 断言
    • 创建断言的语句格式
  • 触发器
    • 定义触发器
    • 激活触发器
    • 删除触发器

实体完整性

定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIAMRY KEY来定义。
对单属性构成的码有:列级约束条件、表级约束条件
对多个属性构成的码只有:表级约束条件
列级约束:行定义的一部分,只能应用于一列上。
表级约束:独立于列的定义,可以应用在一个表中的多列上。

例5.1:将Student表中的Sno属性定义为码

--列级
CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(20) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20)
);

--表级
CREATE TABLE Student(Sno CHAR(9),Sname CHAR(20) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno)
);

例5.2:将SC表中的Sno、Cno属性组定义为码

CREATE TABLE SC(Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY (Sno,Cno)   --只能在表级定义主码
)

实体完整性检查和违约处理

关系数据库管理系统,会按照实体完整性规则自行进行检查
(1)检查主码值是否唯一
(2)检查主码的各个属性是否为空

参照完整性

定义参照完整性

关系模型的参照完整性在CREATE TABLE中
用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码

例5.3:定义SC中的参照完整性

CREATE TABLE SC(Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno) REFERENCES Student(Sno),FOREIGN KEY(Cno) REFERENCES Course(Cno)
);

参照完整性检查和违约处理


上述的不一致发生时,系统可以采用以下策略加以处理:
(1)拒绝执行(NO ACTION)
(2)级联操作(CASCADE)
(3)设置为空值

例5.4:显式说明参照完整性的违约处理示例

CREATE TABLE SC(Sno CHAR(9),Cno CHAR(4),Grade SMALLINT,PRIMARY KEY(Sno,Cno),PRIMARY KEY(Sno) REFERENCES Student(Sno)ON DELETE CASCADEON UPDATE CASCADEPRIMARY KEY(Cno) REFERENCES Course(Cno)ON DELETE NO ACTIONON UPDATE CASCADE
);

用户定义的完整性

属性上约束条件的定义

在CREATE TABLE中定义属性的同时,可以添加如下约束条件:

列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK语句)

不允许取空值

例5.5:在定义SC表时,说明Sno,Cno,Grade属性不允许取空值

CREATE TABLE SC(Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT NOT NULL,PRIMARY KEY(Sno,Cno),
);

列值唯一

例5.6:建立部门表DEPT,要求部门名称Dname列值唯一,部门编号Deptno列为主码

CREATE TABLE DEPT(Deptno NUMERIC(2),Dname CHAR(9) UNIQUE NOT NULL,Location CHAR(10),PRIMARY KEY(Deptno)
);

用CHECK短语指定列值应该满足的条件

例5.7:Student表的Ssex只允许取“男”或“女”

CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(8) NOT NULL,Ssex CHAR(2) CHECK (Ssex IN ('男','女')),Sage SMALLINT,Sdept CHAR(20)
);

例5.8:SC表的Grade的值应该在0和100之间

CREATE TABLE SC(Sno CHAR(9),Cno CHAR(4),Grade SMALLINT CHECK(Grade >= 0 AND Grade <= 100),PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno) REFERENCES Student(Sno),FOREIGN KEY(Cno) REFERENCES Course(Cno)
);

元组上的约束条件

在CREATE TABLE语句中可以使用CHECK短语定义元组上的约束条件,即元组级限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件

例5.9:当学生的性别为男时,其名字不能以Ms.开头

CREATE TABLE Student(Sno CHAR(9),Sname CHAR(8) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno),CHECK(Ssex = '女' OR Sname NOT LIKE 'Ms.%')--等价于--CHECK(Ssex = '男' AND Sname NOT LIKE 'Ms.%')
);

完整性约束命名子句

完整性约束命名子句

CONSTRAINT <完整性约束条件名> <完整性约束条件><完整性约束条件>包括NOT NULL,UNIQUE,PRIMARY KEY,FOREIGN KEY,CHECK短语等

例5.10:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”

CREATE TABLE Student(Sno NUMERIC(9)CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),Sname CHAR(20)CONSTRAINT C2 NOT NULL,Sage NUMERIC(3)CONSTRAINT C3 CHECK(Sage < 30),Ssex CHAR(2)CONSTRAINT C4 CHECK(Ssex IN ('男','女')),CONSTRAINT StudentKey PRIMARY KEY(Sno)
);

例5.11:建立教师表TEACHER,要求每个教师的应发工资不低于3000元。应发工资是工资列Sal和扣除项Deduct之和

CREATE TABLE TEACHER(Eno NUMERIC(4) PRIMARY KEY,Ename CHAR(10),Job CHAR(8),Sal NUMERIC(7,2),Deduct NUMERIC(7,2),Deptno NUMERIC(7,2),CONSTRAINT TEACHERFKey FOREIGN KEY(Deptno) REFERENCES DEPT(Deptno),CONSTRAINT C1 CHECK (Sal + Deduct >= 3000)
);

修改表中的完整性限制

可以使用ALTER TABLE语句 修改表中的完整性限制

例5.12:去掉列5.10 Student表中对性别的完整性限制

ALTER TABLE StudentDROP CONSTRAINT C4;

例5.13:修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄有小于30改为小于40

ALTER TABLE StudentDROP CONSTRAINT C1;
ALTER TABLE StudentADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);
ALTER TABLE StudentDROP COSTRAINT C3;
ALTER TABLE StudentADD CONSTRAINT C3 CHECK(Sage < 40);

修改完整性性质的如何,如果是改变原有的条件的话,先是去掉原有限制,再添加现在需要的限制

断言

在SQL Server中好像并不支持断言ASSERTION语句,运行之后便会报错

创建断言的语句格式

CREATE ASSERTION <断言名> <CHECK子句>

例5.19:限制数据库课程最多60名学生选修

CREATE ASSERTION ASSE_SC_DB_NUM
CHECK(60 >= (SELECT count(*)FROM Course,SCWHERE SC.CNO = COURSE.CNO AND COURSE.CNAME= '数据库')
);

例5.20:限制每个学期每一门课程最多60名学生选修

ALTER TABLE SC
ADD TERM DATE;
--先修改SC表,增加DATE类型的属性TERM
CREATE ASSERTION ASSE_SC_CNUM2
CHECK (60 >=(SELECT COUNT(*)FROM SCGROUP BY Cno,TERM)
);

触发器

触发器:任何用户对表的增、删、改操作均由服务器自动激活相应的触发器。

定义触发器

触发器又叫事件-条件-动作规则。当特定的系统事件(对一个表的增、删、改操作,事务的结束等)发生时,对规则的条件进行检查,如果条件成立的话,执行规则中规定的动作,否则,不执行。

CREATE TRIGGER的命令建立触发器:

CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名>
REFERENCES NEW|OLD ROW AS <常量>
FOR EACH{ROW|STATEMENT}
[WHEN <触发事件>] <触发动作体>
  1. 只有表的创建者才可以在表上创建触发器,并且一个数据库只能创建一定数量的触发器,数量是由创建数据库的人指定的
  2. 触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下
  3. 触发器只能定义在基本表上,但不能定义在视图上
  4. 触发事件可以是INSERT、DELETE、UPDATE,也可以是这几个事件的组合
  5. 触发器可分为:行级触发器(执行n次)和 语句级触发器

例5.21:当对表SC的Grade属性进行修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数

CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCINGOLDROW AS OldTupleNEWROW AS NewTuple
FOR EACH ROW
WHEN (NewTuple.Grade >= 1.1 * OldTuple.Grade)INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)VALUES(OldTuple.Sno,Oldtuple.Cno,OldTuple.Grade,NewTuple.Grade)

例5.22:将每次对表Student的插入操作所增加的学生个数记录到表Student-InsertLog

CREATE TRIGGER Student_Count
AFTER INSERT ON Student
REFERENCINGNEW TABLE DELTA
FOR EACH STATEMENTINSERT INTO StudentInsertLog(Numbers)SELECT COUNT(*) FROM DELTA

例5.23:定义一个BEFORE行级触发器,为教师表Student定义完整性规则“教授的工资不得低于4000元”,如果低于4000元,自动改为4000元

CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
REFERENCING NEW row AS newTuple
FOR EACH ROW
BEGINIF(newtuple.Job='教授') AND (newtuple.Sal<4000)THEN newtuple.Sal := 4000;END IF
END;

激活触发器

触发器激活时遵循如下的执行顺序:

  1. 执行该表上的BEFORE触发器
  2. 激活触发器的SQL语句
  3. 执行该表上的AFTER触发器

删除触发器

删除触发器的SQL语句如下:

DROP TRIGGER <触发器名> ON <表名>;

SQL 数据库完整性相关推荐

  1. SQL关于数据库完整性

    SQL语句关于数据库完整性 数据的正确性和相容性 5.1实体完整性 5.1.1 定义实体完整性 例5.1 将Student表中的Sno属性定义为码. CREATE TABLE Student (Sno ...

  2. SQL语言与数据库完整性和安全性

    数据库完整性和安全性 一.数据库完整性 1.概念 2.约束条件 3.数据库完整性分类 (1) 按约束对象分类 (2) 按约束来源分类 (3)按约束状态分类 二.利用SQL语言实现数据库的静态完整性 1 ...

  3. 数据库完整性及相关SQL语句

    文章目录 数据库完整性SQL语句 实体完整性 定义实体完整性 [例 5.1] 将Student表中的Sno属性定义为码 [例 5.2] 将SC表中的Sno,Cno属性组定义为码 实体完整性检查和违约处 ...

  4. SQL数据库操作完全手册

    SQL数据库完全手册 日期:2001-3-24 0:47:00 出处:电脑报 作者:未知 SQL是Structured Quevy Language(结构化查询语言)的缩写.SQL是专为数据库而建立的 ...

  5. SQL数据库入门基础

      SQL(Structure Query Language,结构化查询语言)语言是国际标准化组织(ISO)采纳的标准数据库语言. 数据库就是一幢大楼,我们要先盖楼,然后再招住户(住户当然就是数据库对 ...

  6. 实验五 数据库完整性技术

    [实验目的] 1.掌握完整性的概念: 2.熟悉SQL SERVER 的完整性技术. 3.了解SQL SERVER 的违反完整性处理措施. [实验性质] 综合性实验 [实验导读] 1.完整性概述 数据库 ...

  7. SQL注入 ——sql数据库操作基础(一)

    本章目的 普及MySQL( MariaDB)薮据库的基础与进阶语法,加深对SQL命令语句的理解,为后续SQL注入攻击与防护实验打下坚实的基础. 基本概念 数据库分类 关系型数据库 ●关系型数据库模型是 ...

  8. 『数据库』这篇数据库的文章真没人看--数据库完整性

    『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了) 文章目录 实体完整性 参照完整性 用户定义的完整性 完整性约束命名子句 域中的完整性限制 触发器 激活触发器 删除触发器 小结 ...

  9. sql数据库 订阅发布_如何使用中央发布者和多个订阅者数据库设置自定义SQL Server事务复制

    sql数据库 订阅发布 In this article, you'll learn how to setup a simple, custom distributed database replica ...

最新文章

  1. 正式压力测试:locust进阶,超简单搭建生产级locust集群
  2. tf2运行YOLOv4(tflite)
  3. 输入两个整数a和b,计算a+b的和
  4. Mysql捕捉(网站)应用执行的语句
  5. float,double等精度丢失问题
  6. Postman操作使用
  7. 操作系统思考 第一章 编译
  8. 厉害!40 张图看懂分布式追踪系统原理及实践
  9. CSRF(跨站请求伪造)攻击 --
  10. 动态修改服务器配置文件,asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)...
  11. linux系统自行清理归档日志_Linux下自动删除归档日志文件的方法
  12. 苹果设备plist编辑器plist editor Pro V2.1绿色版
  13. fterm linux ssh 乱码,用fterm ssh时出现如下乱码,请问如何解决
  14. 知乎2019新知青年大会:用问题改变世界的方向
  15. 《自為墓誌銘·〔明〕張岱》原文|譯文|注釋|賞析
  16. [ML-03] Matplotlib-3
  17. 经过本人盘点与细数,总结出个人云存储与传统网盘五大差别
  18. 网上宣传的0月租流量卡是骗局吗?看完你就知道了!
  19. 【Linux环境搭建】十二、Linux(CentOS7) 时序数据库InfluxDB及Influx-proxy安装配置
  20. 林业病虫害数据集介绍

热门文章

  1. CentOS如何挂载U盘(待更新)
  2. 4*4矩阵键盘扫描c语言,用扫描法读出4×4矩阵键盘,在数码管显示按键值
  3. iOS开发 - 怎么让支持iPad/iPhone的app取消支持iPad或者iPhone中的一项
  4. Docker安装consul
  5. 一加手机发力小屏做行业逆行者
  6. OMG,这篇文章帮你轻松搞懂TCP/IP 协议,看不懂 你来找我!
  7. django url中redirect与 reverse
  8. acm c语言大数问题,acm大数问题 | C/C++程序员之家
  9. 解决Redis启动报错:Transparent Huge Pages (THP) support enabled in your kernel
  10. springboot和springmvc的区别