版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Oracle 数据库教程1第9章 数据完整性本章要点 数据完整性概述 域完整性 实体完整性 参照完整性 Oracle 数据库教程29.1 数据完整性概述数据完整性规则通过约束来实现,约束是在表上强制执行的一些数据校验规则,在插入、修改或者删除数据时必须符合在相关字段上设置的这些规则,否则报错。Oracle使用完整性约束机制以防止无效的数据进入数据库的基表,如果一个DML语句执行结果破坏完整性约束,就会回滚语句并返回一个错误。通过完整性约束实现数据完整性规则有以下优点: 完整性规则定义在表上,存储在数据字典中,应用程序的任何数据都必须遵守表的完整性约束。 当定义或修改完整性约束时,不需要额外编程
2、。 用户可指定完整性约束是启用或禁用。 Oracle 数据库教程39.1 数据完整性概述 当由完整性约束所实施的事务规则改变时,只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。数据完整性一般包括域完整性、实体完整性、参照完整性,用户定义完整性,下面分别进行介绍。1域完整性域完整性指列数据输入的有效性,又称列完整性,通过CHECK约束、DEFALUT约束、NOT NULL约束、数据类型和规则等实现域完整性。CHECK约束通过显示输入到列中的值来实现域完整性,例如:对于stsys数据库score表,grade规定为0分到100分之间,可用CHECK约束表示。 Oracle 数据库教程49
3、.1 数据完整性概述2实体完整性实体完整性要求表中有一个主键,其值不能为空且能唯一地标识对应的记录,又称为行完整性,通过PRIMARY KEY约束、UNIQUE约束、索引或 IDENTITY 属性等实现数据的实体完整性。例如,对于stsys数据库中student表,sno列作为主键,每一个学生的sno列能唯一地标识该学生对应的行记录信息,通过sno列建立主键约束实现student表的实体完整性。3参照完整性参照完整性保证主表中的数据与从表中数据的一致性,又称为引用完整性,参照完整性确保键值在所有表中一致,通过定义主键(PRIMARY KEY)与外键(FOREIGN KEY)之间的对应关系实现参
4、照完整性。 Oracle 数据库教程59.1 数据完整性概述主键(PRIMARY KEY):表中能唯一标识每个数据行的一个或多个列。外键(FOREIGN KEY):一个表中的一个或多个列的组合是另一个表的主键。例如,将student表作为主表,表中的sno列作为主键,score表作为从表,表中的sno列作为外键,从而建立主表与从表之间的联系实现参照完整性,student表和score表的对应关系如表9.1、和表9.2所示。 Oracle 数据库教程69.1 数据完整性概述 Oracle 数据库教程79.1 数据完整性概述如果定义了两个表之间的参照完整性,则要求: 从表不能引用不存在的键值。 如
5、果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。 如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录。总括起来, Oracle数据库中的数据完整性包括域完整性、实体完整性、参照完整性,和实现上述完整性的约束,其中: CHECK约束,检查约束,实现域完整性。 NOT NULL约束,非空约束,实现域完整性。 PRIMARY KEY约束,主键约束,实现实体完整性。 UNIQUE KEY约束,唯一性约束,实现实体完整性。 FOREIGN KEY约束,外键约束,实现参照完整性。 Oracle 数据库教程89.2 域完整性域完整性通过CHECK约束实现,C
6、HECK约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性,下面介绍通过CHECK约束实现域完整性。 Oracle 数据库教程99.2.1 使用SQL Developer 实现域完整性1使用SQL Developer创建CHECK约束【例9.1】使用SQL Developer,在stsys数据库student表的ssex列,创建一个性别为男或女的CHECK约束CK_ssex。(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”约束条件”“添加检查
7、”命令,出现如图9.1所示的“添加检查”窗口中,在“约束条件名称”栏输入约束名称CK_ssex,在“检查条件”栏输入相应的CHECK约束表达式为ssex in (男, 女)。 Oracle 数据库教程10(2)单击“应用”按钮,完成“CHECK约束”的创建。2使用SQL Developer修改或删除CHECK约束【例9.2】使用SQL Developer,修改或删除创建的CHECK约束CK_ssex。(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编
8、辑表”窗口,如图9.2所示。(2)在“编辑表”窗口中,单击“添加”按钮,可以添加一个检查约束;单击“删除”按钮,可以删除一个检查约束;在选择一个检查约束后,可在“名称”栏中修改名称,在“条件”栏修改相应的检查约束表达式。 9.2.1 使用SQL Developer 实现域完整性Oracle 数据库教程11(3)单击“确定”按钮,完成上述“CHECK约束”的添加、删除或修改。 9.2.1 使用SQL Developer 实现域完整性Oracle 数据库教程129.2.2 使用PL/SQL语句实现域完整性1. 使用PL/SQL语句在创建表时创建CHECK约束使用PL/SQL语句在创建表时创建CHE
9、CK约束有作为列的约束或作为表的约束两种方式。语法格式:CREATE TABLE ( DEFAULT NOT NULL | NULL CONSTRAINT CHECK() /*定义为列的约束*/ ,n CONSTRAINT CHECK() /*定义为表的约束*/)其中,CONSTRAINT关键字为CHECK约束定义名称,CHECK约束表达式为逻辑表达式。 Oracle 数据库教程139.2.2 使用PL/SQL语句实现域完整性【例9.3】在stsys数据库中创建表goods2,包含以下域完整性定义CREATE TABLE goods2 ( gid char(6) NOT NULL PRIMAR
10、Y KEY, /*商品号*/ gname char(20) NOT NULL, /*商品名*/ gclass char(6) NOT NULL, /*类型*/ price number NOT NULL CHECK(price=8000), /*价格*/ tradeprice number NOT NULL, /*批发价格*/ stockqt number NOT NULL, /*库存量*/ orderqt number NULL /*订货尚未到货商品数量*/);在上述语句中,定义goods2表price列的CHECK约束表达式为CHECK(price=8000),即价格小于或等于8000。
11、Oracle 数据库教程14【例9.4】在表goods2中,插入记录1005,DELL Inspiron 15R,10,9899,14,7。INSERT INTO goods2 VALUES(1005,DELL Inspiron 15R,10,9899,6930,14,7);在goods2表price列,由于插入记录中的价格大于8000,违反CHECK约束,系统报错,拒绝插入。2. 使用PL/SQL语句在修改表时创建CHECK约束语法格式:ALTER TABLE ADD( CONSTRAINT CHECK() 9.2.2 使用PL/SQL语句实现域完整性Oracle 数据库教程15【例9.5】
12、通过修改goods2表,增加批发价格列的CHECK约束。ALTER TABLE goods2 ADD CONSTRAINT CK_tradeprice CHECK(tradeprice=6000);3. 使用PL/SQL语句删除CHECK约束语法格式:ALTER TABLE DROP CONSTRAINT 【例9.6】删除stsc数据库的goods2表批发价格列的CHECK约束。ALTER TABLE goods2 DROP CONSTRAINT CK_tradeprice; 9.2.2 使用PL/SQL语句实现域完整性Oracle 数据库教程169.3 实体完整性实体完整性通过PRIMARY
13、 KEY约束、UNIQUE约束等实现。通过PRIMARY KEY约束定义主键,一个表只能有一个PRIMARY KEY约束,且PRIMARY KEY约束不能取空值,Oracle为主键自动创建唯一性索引,实现数据的唯一性。通过UNIQUE约束定义唯一性约束,为了保证一个表非主键列不输入重复值,应在该列定义UNIQUE约束。PRIMARY KEY约束与UNIQUE约束主要区别如下: 一个表只能创建一个PRIMARY KEY约束,但可创建多个UNIQUE约束。 PRIMARY KEY约束的列值不允许为NULL,UNIQUE约束的列值可取NULL。创建PRIMARY KEY约束时,系统自动创建聚集索引,
14、创建UNIQUE约束时,系统自动创建非聚集索引。PRIMARY KEY约束与UNIQUE约束都不允许对应列存在重复值 Oracle 数据库教程179.3.1 使用SQL Developer 实现实体完整性 1. 使用SQL Developer创建和删除PRIMARY KEY约束使用SQL Developer创建和删除PRIMARY KEY约束参看4.3.1节相关操作步骤。2. 使用SQL Developer创建和删除UNIQUE约束使用SQL Developer创建与删除UNIQUE约束举例如下:【例9.7】 使用SQL Developer,在course表的课程名列,创建和删除UNIQUE约
15、束。(1)启动”SQL Developer”,展开“表”节点,选中表“student”,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,单击“唯一约束条件”选项,如图9.3所示。 Oracle 数据库教程18 图9.3 “编辑表”窗口“唯一约束条件”选项9.3.1 使用SQL Developer 实现实体完整性 Oracle 数据库教程19(2)单击“添加”按钮,在右边的“名称”栏中输入UNIQUE约束的名称,在“可用列”栏选择要添加到UNIQUE约束的列,这里选择tno列,然后单击“”按钮,将其添加到“所选列”中,如图9.4所示。 9.3.1 使用SQL Develop
16、er 实现实体完整性 Oracle 数据库教程20(3)单击“确定”按钮,完成创建UNIQUE约束。如果要删除UNIQUE约束,打开如图9.4所示的“编辑表”窗口“唯一约束条件”选项,选择要删除的UNIQUE约束,单击“删除”按钮,单击“确定”按钮即可。9.3.2 使用PL/SQL语句实现实体完整性1. 使用PL/SQL语句在创建表时创建PRIMARY KEY约束、UNIQUE约束 9.3.1 使用SQL Developer 实现实体完整性 Oracle 数据库教程219.3.2 使用PL/SQL语句实现实体完整性语法格式:CREATE TABLE /*指定表名*/ ( NULL |NOT N
17、ULL /*定义字段*/ CONSTRAINT /*定义约束名*/ PRIMARY KEY | UNIQUE /*定义约束类型*/ ,n , CONSTRAINT PRIMARY KEY | UNIQUE(,n) /*在所有列定义完毕后定义约束名和约束类型*/)说明: PRIMARY KEY | UNIQUE:定义约束类型,PRIMARY KEY为主键,UNIQUE为唯一键。 可以在某一列后面定义PRIMARY KEY约束和UNIQUE约束,也可以在所有列定义完毕后定义PRIMARY KEY约束和UNIQUE约束,但要提供要定义约束的列或列的组合。 Oracle 数据库教程22【例9.8】对s
18、tsys数据库中goods3表的商品号列创建PRIMARY KEY约束,对商品名称列创建UNIQUE约束。CREATE TABLE goods3( gid char(6) NOT NULL CONSTRAINT PK_gid PRIMARY KEY, gname char(20) NOT NULL CONSTRAINT UK_gname UNIQUE, gclass char(6) NOT NULL, price number NOT NULL CONSTRAINT CK_price CHECK(price=8000), tradeprice number NOT NULL, stockqt
19、number NOT NULL, orderqt number NULL); 9.3.2 使用PL/SQL语句实现实体完整性Oracle 数据库教程232. 使用PL/SQL语句在修改表时创建PRIMARY KEY约束或UNIQUE约束语法格式:ALTER TABLE ADD(CONSTRAINT PRIMARY KEY | UNIQUE (,n)说明:ADD CONSTRAINT对指定表增加一个约束,约束类型为PRIMARY KEY约束或UNIQUE约束。 9.3.2 使用PL/SQL语句实现实体完整性Oracle 数据库教程24【例9.9】在stsys数据库中首先创建goods4表后,通过
20、修改表,对商品号列创建PRIMARY KEY约束,对商品名称列创建UNIQUE约束。创建goods4表语句如下:CREATE TABLE goods4( gid char(6) NOT NULL, gname char(20) NOT NULL, gclass char(6) NOT NULL,price number NOT NULL, tradeprice number NOT NULL, stockqt number NOT NULL, orderqt number NULL); 9.3.2 使用PL/SQL语句实现实体完整性Oracle 数据库教程25通过修改表,对商品号列创建PRIM
21、ARY KEY约束,对商品名称列创建UNIQUE约束的语句如下:ALTER TABLE goods4 ADD (CONSTRAINT PK_goodsgid PRIMARY KEY (gid);ALTER TABLE goods4 ADD (CONSTRAINT UK_goodsgname UNIQUE (gname); 9.3.2 使用PL/SQL语句实现实体完整性Oracle 数据库教程263. 使用PL/SQL语句删除PRIMARY KEY约束、UNIQUE约束语法格式:ALTER TABLE DROP CONSTRAINT ,n;【例9.10】 删除上例创建的PRIMARY KEY约束
22、、UNIQUE约束。ALTER TABLE goods4 DROP CONSTRAINT PK_goodsgid;ALTER TABLE goods4 DROP CONSTRAINT UK_goodsgname; 9.3.2 使用PL/SQL语句实现实体完整性Oracle 数据库教程279.4 参照完整性表的一列或几列的组合的值在表中唯一地指定一行记录,选择这样的一列或多列的组合作为主键可实现表的实体完整性,通过定义PRIMARY KEY约束来创建主键。外键约束定义了表与表之间的关系,通过将一个表中一列或多列添加到另一个表中,创建两个表之间的连接,这个列就成为第二个表的外键,通过定义FOREI
23、GN KEY约束来创建外键。使用PRIMARY KEY约束或UNIQUE约束来定义主表主键或唯一键,FOREIGN KEY约束来定义从表外键,可实现主表与从表之间的参照完整性。定义表间参照关系的步骤是先定义主表主键(或唯一键),再定义从表外键。 Oracle 数据库教程289.4.1 使用SQL Developer 实现参照完整性【例9.11】使用SQL Developer,在stsys数据库中建立student表和score表的参照关系,再删除表间参照关系。(1)按照前面介绍的方法定义主表主键,此处已定义student表的sno列为主键。(2)启动”SQL Developer”,在”连接”节
24、点下打开数据库连接”sys_stsys”,展开“表”节点,选中表score,单击鼠标右键,在弹出的快捷菜单中选择”编辑”命令,出现“编辑表”窗口,单击“外键”选项。(3)单击“添加”按钮,在右边的“名称”栏中输入外键的名称,这里是score_student_FK1,在“引用表”栏中输入引用表的 Oracle 数据库教程29名称,这里是student,在“关联”栏的“本地列”中显示可用于创建外键的列,可以在下拉列表框中选择,这里选择sno,则在”student上的引用列”显示sno,如图9.5所示。 9.4.1 使用SQL Developer 实现参照完整性Oracle 数据库教程30(4)单击
25、 “确定”按钮,完成表间参照关系的创建。(5)在图9.5所示的界面中,选择需要删除的外键,这里是score_student_FK1,单击“删除”按钮,单击“确定”按钮,即可删除选择的外键。1. 使用PL/SQL语句创建表间参照关系创建主键(PRMARY KEY约束)及唯一键(UNIQUE约束)的方法在前面已作介绍,这里介绍通过PL/SQL语句创建外键的方法。 9.4.1 使用SQL Developer 实现参照完整性Oracle 数据库教程319.4.2 使用PL/SQL语句实现参照完整性 1)创建表的同时定义外键语法格式:CREATE TABLE ( CONSTRAINT REFERENCE
26、S ( ,.n ) ,n CONSTRAINT FOREIGN KEY ( ,.n ) )其中:= REFERENCES ( ,.n ) ON DELETE CASCADE | SET NULL Oracle 数据库教程32说明: 可以定义列的外键约束和表的外键约束。定义列的外键约束在列定义的后面使用REFERENCES关键字定义外键,其对应的主表名的主键或唯一键的列名,在主表名后面的括号中指定。定义表的外键约束在列定义的后面使用FOREIGN KEY关键字定义外键,并在后面包含要定义的列。 定义外键定义有以下参照动作:ON DELETE CASCADE:定义级联删除,从主表删除数据时自动删除
27、从表中匹配的行。ON DELETE SET NULL:从主表删除数据时设置从表中对应外键键列为NULL。如果未指定动作,当删除主表数据时,如果违反外键约束,操作会被禁止。 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程33【例9.12】创建stu表,字段名与student表相同,其中sno列作为外键,与已建立的以sno列作为主键student表创建表间参照关系,并插入2条记录:121001,刘鹏翔,1992-08-25和121002,李佳慧,1993-02-18。CREATE TABLE stu( sno char(6) NOT NULL REFERENCES stu
28、dent(sno), sname char(8) NOT NULL, sbirthday date NULL);INSERT INTO stu VALUES(121001,刘鹏,TO_DATE(19920825,YYYYMMDD);INSERT INTO stu VALUES(121002,李佳,TO_DATE(19930218,YYYYMMDD); 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程34【例9.13】 在stu表中,插入1条student表中不存在学号的记录:121005,王晓燕,1993-10-28;在student表中,删除1条stu表中已存在学号的
29、记录:121001,刘鹏翔,1992-08-25。INSERT INTO stu VALUES(121005,王晓燕,TO_DATE(19931028,YYYYMMDD);在stu表中插入的1条记录,其学号在student表中不存在,违反FOREIGN KEY约束,系统报错,拒绝插入。DELETE FROM student WHERE sno=121001;在student表中删除1条记录,其学号在stu表中已存在,违反FOREIGN KEY约束,系统报错,拒绝删除。 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程35【例9.14】创建sco表,字段名与score表相
30、同,以学号、课程号组合作为外键,与已建立的以学号、课程号组合作为主键的score表创建表间参照关系,并且当删除score表中的记录时同时删除sco表中与主键对应的记录。创建sco表,定义了外键和级联删除,其语句如下。CREATE TABLE sco( sno char(6)NOT NULL, cno char(4)NOT NULL, grade int NULL, CONSTRAINT FK_sco FOREIGN KEY(sno,cno) REFERENCES score (sno,cno) ON DELETE CASCADE); 9.4.2 使用PL/SQL语句实现参照完整性 Oracle
31、 数据库教程36在从表sco表插入与主表score同样的18条记录。由于在建立score表和sco表的表间参照关系时定义了级联删除,当删除score表cno为1004的记录时自动删除stu表中匹配行。DELETE FROM score WHERE cno=1004;对主表执行结果进行查询,可以看出,主表已删除cno为1004的3条记录,剩下15条记录。SELECT * FROM score; 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程37 查询结果:SNO CNO GRADE - - -124001 4002 94 124002 4002 74 124003 40
32、02 87 121001 8001 94 121002 8001 88 121004 8001 81 124001 8001 95 124002 8001 73 124003 8001 86 15 rows selected对从表执行结果进行查询,此时从表已自动删除cno为1004的3条记录,剩下15条记录,实现了级联删除。 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程38SELECT * FROM sco;查询结果:SNO CNO GRADE - - -124001 4002 94 124002 4002 74 124003 4002 87 121001 8001
33、 94 121002 8001 88 121004 8001 81 124001 8001 95 124002 8001 73 124003 8001 86 15 rows selected 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程392)通过修改表定义外键语法格式:ALTER TABLE ADD CONSTRAINT FOREIGN KEY( ,n) REFERENCES (,n) 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程40【例9.15】 修改stsys数据库中score表的定义,将它的“课程号”列定义为外键,假设course
34、表的“课程号”列已定义为主键。ALTER TABLE score ADD CONSTRAINT FK_score_course FOREIGN KEY(cno) REFERENCES course(cno);2. 使用PL/SQL语句删除表间参照关系语法格式:ALTER TABLE DROP CONSTRAINT ,n; 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程41【例9.16】删除以上对score课程号列定义的FK_score_course外键约束。ALTER TABLE score DROP CONSTRAINT FK_score_course; 9.4.2 使用PL/SQL语句实现参照完整性 Oracle 数据库教程429.5 综合训练1. 训练要求(1)在stsys数据库中建立3个表:st,co,sc(2)将st表中sno修改为主键。(3)将st表中的age列的值设为应在1625之间。(4)将sc表中sno设置为引用sc表中sno列的外键。(5)将sc表中cno设置为引用co表中cno列的外键。(6)删除前面所有的限定。2. 实现的程序代码根据题目要求,编写PL/SQL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4 《地球-我们的家园》(教学实录)部编版道德与法治六年级下册
- 化妆合同范例 简易范例
- 开发项目技术合同范例
- 2025年马鞍山货运上岗证考试题库
- 大学商铺合同范例
- 无锡农村平房买卖合同范例
- 再生钢材采购合同范例
- 农村合伙购房合同范例
- 技术成果合同范例
- 汕头律师合同范例
- 【中药贮藏与养护问题及解决对策4000字(论文)】
- 自然环境对聚落的影响
- 2023-2024学年天津市部分地区六年级数学第一学期期末综合测试试题含答案
- 河南省洛阳市偃师区2023-2024学年四年级数学第一学期期末经典模拟试题含答案
- 小学生预防性侵讲稿
- 人工智能算法贝叶斯算法
- 外墙外保温监理实施细则
- 剪映使用课件s
- B2B电子商务网站调研报告
- 物理学之美(插图珍藏版)
- 《基础教育课程改革(新课程改革)》题库含答案解析
评论
0/150
提交评论