网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  循序渐进讲解oracle数据库的完整性概念     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:80次  录入:管理员--2008-05-05  
 

【赛迪网-it技术报道】一、oracle中的实体完整性

oracle在create table语句中提供了primary key子句,供用户在建表时指定关系的主码列。例如,在学生-选课数据库中,要定义student表的sno为主码,可使用如下语句: create table student

(sno number(8),

sanme varchar(20),

sage number(20),

constraint pk_sno primary key(sno));

其中,primary key(sno)表示是student表的主码。pk_sno是此主码约束名。

若要在sc表中定义(sno,cno)为主码,则用下面语句建立sc表: create table sc

(sno number(8),

cno number(2),

grade number(2),

constraint pk_sc primary key(sno,cno));

用primary key语句定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自动进行完整性检查,凡操作使主码值为空或使主码值在表中不唯一,系统拒绝此操作,从而保证了实体完整性。

二、oracle中的参照完整性

oracle的create table语句也可以定义参照完整性规则,即用foreign key子句定义哪些列为外码列,用references子句指明这些外码相应于哪个表的主码,用on delete cascade子句指明在删除被参照关系的元组时,同时删除参照关系中相应的远祖。

例如,使用如下sql语句建立emp表: create table emp

(empno number(4),

ename varchar(10),

job varchar2(9),

mgr number(4),

sal number(7,2),

deptno number(2),

constraint fk_deptno

foreign key(deptno)

references dept(deptno));

则表明emp是参照表,dept为其被参照表,emp表中deptno为外码,它相应于dept表中的主码deptno。当删除或修改dept表中某个元组的主码时要检查emp中是否有元组的deptno值等于dept中要删除的元组的deptno值,如没有,接受此操作;否则系统拒绝这一更新操作。

如果用如下sql语句建立emp表: create table emp

(empno number(4),

ename varchar(10),

job varchar2(9),

mgr number(4),

sal number(7,2),

deptno number(2),

constraint fk_deptno

foreign key(deptno)

references dept(deptno)

on delete cascade);

当要修改dept表中的deptno值时,先要检查emp表中有无元组的deptno值与之对应,若没有,系统接受这个修改操作,否则,系统拒绝此操作。

当要删除dept表中某个元组时,系统也要检查emp表,若找到相应元组则将它们也随之删除。

三、oracle中用户定义的完整性

除实体完整性和参照完整性外,应用系统中往往还需要定义与应用有关的完整性限制。例如:要求某一列的值不能取空值,要在表中是唯一的,要在某个取值范围中等。oracle允许用户在建表时定义下列完整性约束:

列值非空(not null短语)

列值唯一(unique短语)

检查列值是否满足一个布尔表达式(check短语)

例1 建立部门表dept,要求部门名称dname列取值唯一,部门编号deptno列为主码。 create table dept

(deptno number,

dname varchar(9) constraint u1 unique,

loc varchar(10),

constraint pk_dept primary key (deptno));

其中constraint u1 unique表示约束名为u1,该约束要求dname列值唯一。

例2 建立学生登记表student,要求学号在90000~99999之间,年龄<29,性别只能是“男”或“女”,姓名非空。 create table student

(sno number(5) constraint c1 check (sno between 90000 and 99999),

sname varchar(20) constraint c2 not null,

sage number(3) constraint c3 check (sage<29),

ssex varchar(2) constraint c4 check(ssex in('男','女')));

例3 建立职工表emp,要求每个职工的应发工资不得超过3000元。应发工资实际上就是实发工资列sal与扣除项deduct之和。 create table emp

(eno number(4),

ename varchar(10),

job varchar(8),

sal number(7,2),

deduct number(7,2),

deptno number(2),

constraint c1 check (sal + deduct <= 3000));

在oracle中,除列值非空、列值唯一、检查列值是否满足一个布尔表达式外,用户还可以通过触发器(trigger)来实现其他完整性规则。所谓数据库触发器,就是一类靠事件驱动的特殊过程,一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发器,在核心层进行集中的完整性控制。

定义数据库触发器的语句是create trigger。

例4 为教师表teacher定义完整性规则“教授的工资不得低于1000元,如果低于1000元,自动改为1000元”。 create trigger update_sal

before insert or update of sal, pos

on teacher

for each row

when (:new.pos = '教授') /**//* 某教员晋升为教授 */

begin

if :new.sal < 1000

then

:new.sal := 1000;

end if;

end;

综上所述,oracle提供了create table语句create trigger语句定义完整性约束条件,其中用create table语句可以定义很复杂的完整性约束条件。完整性约束条件一旦定义好,oracle会自动执行相应的完整性检查,对于违反完整性约束条件的操作或者拒绝执行或者执行事先定义的操作。

 
 
上一篇: 如何使用dbms_repair检测和修补数据坏块 (1)    下一篇: 讲解oracle数据库提供的多种安全性措施 (1)
  相关文档
用forall与bulk collect快速复制表数据 (1) 03-27
oracle数据库exp imp按用户导出导入实例 (1) 03-31
oracle的共享封锁 独占封锁和共享更新封锁 (1) 05-28
要求例程恢复,无法设置archivelog模式 03-03
针对oracle的tns listener攻击方法整理 08-08
探讨基于不绑定变量与绑定变量的柱状图作用 (1) 03-10
教你在不同数据库环境下读取前n条记录数 07-14
Oracle中用LogMiner分析重做及归档日志 04-11
将 Oracle 内置的安全特性用于 PHP 05-13
oracle ebs 11.5 for linux as4安装心得 08-08
oracle最强有力的辅助诊断工具sql_trace (1) 04-30
SQL Server与Oracle、DB2的性能比较 04-11
轻松掌握关闭oracle死锁进程的具体步骤 05-12
利用Oracle执行计划机制提高查询性能 04-11
数据库不在open状态下的冷备份恢复步骤 02-29
教你使用智能优化器提高Oracle性能极限 05-27
for loop读取游标和open close的区别 04-15
轻松掌握oracle数据库开发中序列的使用 08-05
在一个表中最多可以有1000列还是255列 03-05
去掉数据库的初始化参数即可禁用xdb服务 03-05
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息