数据库完整性和触发器

数据库的完整性是指数据的正确性和相容性。如学号必须唯一,性别必须是男或女,年龄范围在18-25等。

一、实体完整性

实体性规则如下:

1、检查主码值是否唯一,如果不唯一则拒绝插入或修改。

2、检查主码的各个属性是否为空(如果主码为多个码),只要有一个为空就拒绝插入或修改。

二、参照完整性

参照完整性检查(以下为违约情况):

1、SC表中增加一个元组,该元组的Sno属性的值在Student中找不到一个元组,其Sno属性值与之相等。

2、修改SC表中的一个元组,该元组的Sno属性值在Student中找不到一个元组,其Sno属性值与之相等。

3、从Student中删除一个元组,使SC中某个元组的Sno在Student中找不到与之Sno属性值相等的元组。

4、修改Student中的一个元组,使SC中某个元组的Sno在Student中找不到与之Sno属性值相等的元组。

当上述违约情况发生时可能的处理方式有:

1、拒绝执行(NO ACTION):不允许该操作执行。该策略为默认策略。

2、级联操作(CASCADE):当删除或修改被参照的一个元组造成了参照表的不一致,则修改或删除参照表中的所有造成不一致的元组。

3、设置为空值:当删除或修改被参照的一个元组造成了参照表的不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

三、用户定义的完整性

用户自定义完整性约束条件大致可以归纳为如下几种情况:当往删除或修改元组属性值时,如果一年约束条件违约,则拒绝执行操作。

1、不允许取空值:NOT NULL

CREATE TABLE IF NOT EXISTS TTest
	(Sno CHAR(9) NOT NULL DEFAULT '1',
	Cno CHAR(4) NOT NULL,
	Grade SMALLINT NOT NULL,
	PRIMARY KEY (Sno,Cno));
DROP TABLE IF EXISTS TTEST;

 2、列值唯一:UNIQUE

CREATE TABLE IF NOT EXISTS TDept
	(DeptNo NUMERIC(20) PRIMARY KEY ,
	Dname CHAR(10) UNIQUE,
	Location CHAR(10) NOT NULL);
DROP TABLE IF EXISTS TDept;

 3、指定列值应该满足条件:CHECK

CREATE TABLE IF NOT EXISTS TSC
	( Sno CHAR(9) NOT NULL,
	Sname CHAR(10) UNIQUE NOT NULL,
	Ssex CHAR(6) CHECK (Ssex IN ('Boy','Girl')),
	Sage SMALLINT,
	Sdept CHAR(20));
DROP TABLE IF EXISTS TSC;

 四、完整性约束命名子句

为了灵活的增加、删除、修改这些完整性约束条件,SQL提供了一个完整性约束命名子句CONSTRAINT。

关于完整性约束命名子句CONSTRAINT这里就不细述了,感兴趣就找本书参考参考吧!

五、触发器(Trigger)

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。触发器的定义规则如下:

CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发时间> ON <表名>
FOR EACH {ROW|STATEMENT}
[WHEN <出发时间>]
<触发动作体>;

[ 触发事件]:可以是INSERT、DELETE或UPDATE,也可以是组合如INSERT OR UPDATE,UPDATE后还可以有OF<触发列,...>进一步指明修改哪些列时触发。

[触发器类型]:分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)。假设现在在Teacher表上创建一个AFTER UPDATE触发器。如果Teacher有1000行,执行UPDATE Teacher SET Deptno=5;如果该触发器为语句级触发器,则只触发动作一次,如果为行级触发器则会触发动作1000次。

[触发条件]:触发器被激活时,只有触发条件为真时触发动作体才执行,如果没有WHEN,则立即执行。

下面是一个触发器的实例:

CREATE TABLE TTrig(
	Tno CHAR(10) PRIMARY KEY,
        Tname CHAR(12) NOT NULL DEFAULT 'Tname',
        Tage SMALLINT);

DROP TRIGGER IF EXISTS  `strg`;
CREATE TRIGGER `strg` BEFORE INSERT ON  `student` 
FOR EACH
ROW INSERT INTO Trig
VALUES (
NEW.Sno, NEW.Sname, NEW.Sage
);

 

 

 

转载于:https://www.cnblogs.com/binmaizhai/archive/2013/03/19/2968813.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值