数据库完整性

实体完整性定义(主键)

eg:将 Student 表中的 Sno 属性定义为码
(1) 在列级定义主码

CREATE TABLE Student
 (Sno CHAR(9) PRIMARY KEY ,//列级别的主码
 Sname CHAR(20) NOT NULL , 
 Ssex CHAR(2) ,
 Sage SMALLINT ,
 Sdept CHAR(20));

(2) 在表级定义主码

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

(3)将 SC 表中的 Sno , Cno 属性组定义为码

CREATE TABLE SC
 (Sno CHAR(9) NOT NULL , 
 Cno CHAR(4) NOT NULL , 
 Grade SMALLINT ,
 PRIMARY KEY (Sno , Cno) /* 只能在表级定义主码 */
 );
实体完整性检查和违约处理

插入或对主码列进行更新操作时, RDBMS 按照实体完整性规则自动进行检查。包括:
 1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改
 2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

参照完整性定义(外键)

eg:关系 SC 中一个元组表示一个学生选修的某门课程的成绩,( Sno , Cno )是主码。 Sno , Cno 分别参照引用Student 表的主码和 Course 表的主码
定义 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. 设置为空值( SET-NULL )
• 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
eg:显式说明参照完整性的违约处理示例

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) 
	ON DELETE CASCADE /* 级联删除 SC 表中相应的元组 */
	 ON UPDATE CASCADE , /* 级联更新 SC 表中相应的元组 */
	 FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION 
	 /* 当删除 course 表中的元组造成了与 SC 表不一致时拒绝删除 */
	 ON UPDATE CASCADE 
	 /* 当更新 course 表中的 cno 时,级联更新 SC 表中相应的元组 */
 ) ;
用户定义的完整性(数据类型以及check)
  1. 属性上的约束条件的定义
    CREATE TABLE 时定义
     列值非空( NOT NULL )
     列值唯一( UNIQUE )
     检查列值是否满足一个布尔表达式( CHECK )
    eg:在定义 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) , 
 /* 如果在表级定义实体完整性,隐含了 Sno , Cno 不允许取空值
,则在列级不允许取空值的定义就不必写了 * /
 );
  1. 属性上的约束条件检查和违约处理
    插入元组或修改属性的值时, RDBMS 检查属性上的约束条件是否被满足
    如果不满足则操作被拒绝执行

  2. 元组上的约束条件的定义
    eg:当学生的性别是男时,其名字不能以 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.%')
	 /* 定义了元组中 Sname 和 Ssex 两个属性值之间的约束条件 */
 ) ;
  性别是女性的元组都能通过该项检查,因为 Ssex=‘ 女’成立;
  当性别是男性时,要通过检查则名字一定不能以 Ms. 打头
  1. 元组上的约束条件检查和违约处理
     插入元组或修改属性的值时, RDBMS 检查元组上的约束条件是否被满足
     如果不满足则操作被拒绝执行
完整性约束命名子句(CONSTRAINT 约束)

CONSTRAINT 约束:
CONSTRAINT < 完整性约束条件名 > [ PRIMARY KEY 短语 |FOREIGN KEY 短语 |CHECK 短语]

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

 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)
 ) ;
  在 Student 表上建立了 5 个约束条件,包括主码约束(命名为StudentKey )以及 C1 、 C2 、 C3 、 C4 四个列级约束。

eg:修改表 Student 中的约束条件,要求学号改为在900000~999999 之间,年龄由小于 30 改为小于 40
 可以先删除原来的约束条件,再增加新的约束条件

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) ;
域中的完整性限制(注意和完整性约束命名字句区分)

SQL 支持域的概念,并可以用 CREATE DOMAIN 语句建立一个域以及该域应该满足的完整性约束条件。(可供整个数据库使用)
eg:建立一个性别域,并声明性别域的取值范围

CREATE DOMAIN GenderDomain CHAR(2)
 CHECK (VALUE IN (' 男 ' , ' 女 ') );

这样对 Ssex 的约束说明可以改写为 Ssex GenderDomain

触发器
  • 触发器( Trigger )
    是用户定义在关系表上的一类由事件驱动的特殊过程
     由服务器自动激活
     可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力

  • CREATE TRIGGER 语法格式 (不同的数据库的语法不一样)

 CREATE TRIGGER < 触发器名 > 
 {BEFORE | AFTER} < 触发事件 > ON < 表名 >
 FOR EACH {ROW | STATEMENT}
 [ WHEN < 触发条件 > ]
 < 触发动作体 >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值