SQL的进阶篇之一
很久没有写一些关于技术性的文章了,所以今天脑袋发热,在上午练习SQL语言结束后来忽悠下大家~~嘎嘎~·
标题之所以为进阶篇,我个人理解为下面分享的数据库完整性应该比那些基本的添加、删除、修改要强点吧,也就是在常用的东西上面再来点不常用的,然后就可以大义凛然的说这是一篇SQL进阶文章 嘿嘿 (不爽的 可以飘过 也不用抛砖了)
数据库完整性大致可以分为下面几种,关系模型的参照完整性、用户定义的完整性、约束完整性、域中完整性限制和触发器吧,而触发器这个东东说白了就是事件的驱动,比约束强那么点点,就好比一个人他每天要吃饭一样,到了时间,肚子就开始发叫,而且这还是自动的,真TMD的见鬼。
参照完整性在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) /*在表级定义参照完整性*/
on delete cascade /*当删除student表中的元组时,级连删除SC表中相应的元组*/
on update cascade, /*当更新……………………………….级连更新……………………*/
foreign key(Cno) references Course(Cno) /*在表级定义参照完整性*/
on delete no action /*当删除course表中的元组造成了与SC表不一致时拒绝删除*/
on update cascade /*当更新course表中的cno时,级联更新SC表中相应的元组*/
);
用户自定义完整性即针对某一具体应用的数据必须满足的语义要求包括:列值非空(not null)、列值唯一(unique)、检查列值是否满足一个布尔表达式(check)
create table sc
(
Sno char(9) not null, /*Sno不能为空*/
Sname char(8) unique, /*要求Sname取值唯一*/
Ssex char(2) check (Ssex in(‘男’,'女’)), /*性别属性Ssex只允许取男或女*/
Grade smallint check(Grade >=0 and Grade <=100), /*定义Grade的值在0到100之间*/
primary key(Sno),
check (Ssex=’女’ or Sname not like ‘MS.%’) /*定义Sname和Ssex的约束条件即性别是男时其名字不能以MS.开头*/
);
完整性约束命名子句constraint,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件
比如建立一个学生登记表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)
);
域中的完整性限制可以用create domain建立一个域已经该域应该满足的完整性约束条件
create domain GenderDomain char(2)
check(value in(‘男’,'女’));
好了终于又说到触发器Trigger了 触发器器名可以包含模式名,也可以不包含,在同一模式下触发器名必须是唯一的,并且触发器名和表名必须在同一模式下,而触发器事件可以是插入,删除,修改,也可以是这个几个事件的组合,如insert or delete等。至于类型可以分为行级触发器(for each row)和语句级触发器(for each statement)
定义一个before行级触发器,为教师表teacher定义完整性规则“教授的工资不得低于4000元,如果低于自动改为4000元”
create trigger insert_or_update /*在教师表上定义触发器*/
berfore insert or update on teacher /*触发事件是插入或更新操作*/
for each row /*这是行级触发器*/
as begin /*定义触发动作体,这是一个PL/SQL过程块*/
if(new.job=’教授’) and (new.sal<4000) then
new.sal:=4000; /*因为是行级触发器,可在过程体重使用插入或更新操作后的新值*/
end if
end; /*触发体动作结束*/
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行,一个数据表可以定义多个触发器,比如多个before触发器,多个after触发器,同一表上的触发器激活顺序:
(1)执行该表上的before触发器
(2)激活触发器的SQL语句
(3)执行该表上的after触发器
对于同一个表上的多个before(after)触发器,遵循“谁先创建谁先执行”的原则即按照触发器创建的时间先后顺序执行,有些RDBMS是按照触发器名称的字母排序顺序执行触发器
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好了,需要学习的童鞋们慢慢消化吧
最近天气不太好,老下雨,望各位保重身体,然后一起抗暑
送首歌 温岚的《傻瓜》
[Audio:http://eatdoku.com/File/Mp3/3.mp3]
活学活用,分析的还是相当详细的,有机会分享下数据库的储存过程吧
Reply
你这个和我们学的不太一样,不懂
只不过还是有当老师的资历,小幽小幽的
支持,继续加油
好想和你们一组但被无情的拒绝了,很伤心
Reply
@晴朗
这哥们实在 争取吧
Reply
@蚯蚓
大部分是数据库完整性的一些知识,应该差不多吧
至于一组,这个主要就是因为提前都大家都在一起的,而且学习嘛,并不一定要依附于组员,自己努力就好!
Reply
整理了找起来也方便,不过说实话,SQL这东西的确很复杂!
Reply
@逅客
规律性的东西就是从简单->复杂->简单
Reply
@Roam
以后要多请教你哟!!谢谢
Reply
实在太专业了~~“
Reply