数据库的完整性是指数据的正确性和相容性。如学号必须唯一,性别必须是男或女,年龄范围在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
);