数据库系统概论之完整性约束命名⼦句
SQL可以在CREATE TABLE语句中提供了完整性约束命名⼦句CONSTRAINT,⽤于对完整性约束条件命名,从⽽可以灵活的增加、删除⼀个完整性约束条件。
完整性约束命名⼦句
完整性约束命名⼦句
语法:
CONSTRAINT<;完整性约束条件名><;完整性约束条件>
-- 完整性约束条件包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等。
-- 建⽴学⽣登记表Student,要求学号在90000-999999之间,姓名不能为空,年龄⼩于30,性别只能是男或⼥
CREATE TABLE Student(
Sno NUMERIC(6)
CONSTRAINT C1 CHECK(Sno BETWEEN90000and99999),
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
ADD CONSTRAINT C1 CHECK(SNO BETWEEN9000AND9999);
断⾔
在SQL中可以使⽤数据定义语⾔中的CREATE ASSERTION语句,通过声明性断⾔来指定更具⼀般性的约束
创建断⾔的语句格式
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表中添加⼀条元组,这个断⾔机制都会被触发⼀遍
删除断⾔的语句格式
DROP ASSERTION <;断⾔名>
触发器
触发器是⽤户定义在关系表上的⼀类有事件驱动的特殊过程。触发器类似于约束,但是⽐约束更加灵活,可以实施更为复杂的检查和操作,具有更精细和更强⼤的数据控制能⼒。
定义触发器
触发器⼜叫做事件-条件-动作规则。
CREATE TRIGGER<;触发器名>/*每当触发事件发⽣时,该触发器被激活*/
{BEFORE |AFTER}<;触发事件>ON<;表名>/*指明触发器激活的时间是在执⾏触发事件前或后*/
REFERENCING NEW|OLD ROW AS<;变量>/*REFERENCING指出引⽤的变量*/
FOR EACH{ROW|STATEMENT}              /*定义触发器的类型,指明动作执⾏的频率*/
[WHEN<;触发条件>]<;触发动作者>/*仅当触发条件为真时才执⾏触发动作体*/
部分语义说明:
只有表的拥有者,即创建表的⽤户才可以在表上创建触发器
触发器名:可以包括模式名,也可以不包括模式名。同⼀模式下、触发器名必须是唯⼀的,并且触发器名和表名必须在同⼀模式下触发器只能定义在基本表上
创建唯一约束sql语句
触发事件:可以是INSERT、DELETE或UPDATE,也可以是这⼏个事件的组合。AFTER/BEFORE是触发时机
触发器类型:按照触发动作的间隔尺⼨可以分为⾏级触发器(FOR EACH ROW)和语句触发器(FOR EACH STATEMENT)
触发条件:只有触发条件为真时,才会触发
触发动作体:触发动作体既可以是⼀个匿名PL/SQL过程块,也可以是对已创建存储过程的调⽤。
create trigger SC_T                /*SC_T是触发器的名字*/
after update of Grade ON SC    /*UPDATE OF Grade ON SC 是触发事件,
After是触发的时机,表⽰对SC的Grade属性修改完后再触发下⾯的规则*/
referencing
OLDROW as OldTuple,
NEWROW as NewTuple
FOR EACH ROW/*⾏级触发器,即每执⾏⼀次Grade的更新,下⾯的规则就执⾏⼀次*/
WHEN(NewTuple.Grade>=1.1*OldTuple)/*触发条件,只有该条件为真时才执⾏*/
INSERT INTO SC_U(Sno, Cno, OldGrade, NewGrade)/*下⾯的insert操作*/
values(OldTuple.Sno, OldTuple.Cno, OldTuple.Grade, NewTuple.Grade);
激活触发器
触发器的执⾏是有触发事件激活的,并由数据库服务器⾃动执⾏的。
触发器激活时遵循如下的执⾏顺序:
1. 激活该表的BEFORE触发器
2. 激活触发器的SQL语句
3. 执⾏该表上的AFTER触发器
对于同⼀个表上的多个BEFORE(AFTER)触发器1,遵循“谁先创建谁先执⾏”的原则,即按照触发器创建的时间先后顺序执⾏。有些关系数据库管理系统是按照触发器名字的字母排序顺序执⾏触发器的。
删除触发器
DROP TRIGGER<;触发器名>ON<;表名>
触发器是⼀种功能强⼤的⼯具,但在使⽤时要慎重,因为每次访问⼀个表时都可能触发⼀个触发器,这样会影响系统的性能。