数据库系统概论基础篇——第5讲 数据库完整性

5.1 实体完整性

5.1.1 定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。

// 将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)   /* 在表级定义主码 */
);

// 将SC表中的Sno, Cno属性组定义为码
CREATE TABLE SC(
	Sno CHAR(9) NOT NULL,
	Cno CHAR(4) NOT NULL,
	Grade SMALLINT,
	PRIMARY KEY(Sno, Cno)   /* 只能在表级定义主码 */
);

5.2 参照完整性

5.2.1 定义参照完整性

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

例如,关系SC中一个元组表示一个学生选修的某们课程的成绩,(Sno, Cno)是主码。Sno、Cno分别参照引用Student表的主码和Course表的主码。

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)  /* 在表级定义参照完整性 */
);

5.3 用户定义的完整性

5.3.1 属性上的约束条件

在CREATE TABLE中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK短语)
CREATE TABLE Student(
	Sno CHAR(9) PRIMARY KEY,   /* 在列级定义主码 */
	Sname CHAR(20) NOT NULL,
	Ssex CHAR(2) CHECK (Ssex IN ('男', '女')),
							   /* 性别属性Ssex只允许取‘男’或‘女’ */
	Sage SMALLINT,
	Sdept CHAR(20);

CREATE TABLE SC(
	Sno CHAR(9) NOT NULL,
	Cno CHAR(4) NOT NULL,
	Grade SMALLINT CHECK (Grade >= 0 AND Grade <= 100), 
								/* Grade取值范围是0到100*/
	PRIMARY KEY(Sno, Cno),   /* 只能在表级定义主码 */
	FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 在表级定义参照完整性 */
	FOREIGN KEY (Cno) REFERENCES Course(Cno)  /* 在表级定义参照完整性 */
);

5.3.2 元组上的约束条件

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

// 当学生的性别是男时,其名字不能以Ms.开头
CREATE TABLE Student(
	Sno CHAR(9),
	Sname CHAR(20) NOT NULL,
	Ssex CHAR(2) CHECK (Ssex IN ('男', '女')),
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY (Sno),    	 /* 在表级定义主码 */
	CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
					/* 定义了元组中Sname和Ssex两个属性值之间的约束条件 */;

5.4 完整性约束命名子句

以上讲解的完整性约束条件都是在CREATE TABLE语句中定义,SQL还在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。
** 1. 完整性约束命名子句**

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

CREATE TABLE Student(
	Sno NUMERIC(6)
		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)    	 /* 在表级定义主码 */
);

ALTER TABLE Student
	DROP CONSTRAINT C4;

ALTER TABLE Student
	DROP CONSTRAINT C1;
ALTER TABLE Student
	ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);
ALTER TABLE Student
	DROP CONSTRAINT C3;
ALTER TABLE Student
	ADD CONSTRAINT C3 CHECK (Sage < 40);

*5.5 域中的完整性限制(略)

5.6 断言

在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言(declarative assertions)来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
1. 创建断言的语句格式

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

// 限制数据库课程最多60名学生选修
CREATE ASSERTION ASSE_SC_DB_NUM
	CHECK (60 >= (SELECT count(*)
				FROM Course,SC
				WHERE SC.Cno = Course.Cno AND Course.Cname = '数据库')
		);
// 每当学生选修课程时,将在SC表中插入一条元组(Sno, Cno, NULL),ASSE_SC_DB_NUM断言被触发检查。
// 如果选修数据库课程的人数已经超过60人,CHECK子句返回值为“假”,对SC表的插入操作被拒绝。

5.7 触发器(暂略)

触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值