数据完整性和并发控制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数据完整性和并发控制数据完整性描述•数据完整性是指数据的正确性和相容性•DBMS必须提供一种功能来保证数据库的数据完整性,既完整性检查。•防止数据库存在不符合语义的数据,防止错误信息输入和输出ORACLE数据完整性类型•完整性约束,对表的列定义一规则的说明性方法•数据库触发器,使用非说明方法实施完整性规则•主键约束:主键表示一个唯一的标识,本身不能为空,•唯一约束:在一个表中只允许建立一个主键的约束,而其他列如果不希望出现重复值,则可以使用唯一约束•检查约束:检查一个列的内容是否合法。•非空约束:如姓名的内容不允许为空•外键约束:在两个表之间进行约束操作(1)主键约束(PRIMARYKEY)•主键可以用来唯一的标识一条记录•主键相当于非空约束和唯一约束的组合•在一张表中只允许有一个主键•这个主键可以是一个或者多个子段的组合例:建立person表,在pid上增加主键约束•CREATETABLEperson•(•pidVARCHAR2(18)PRIMARYKEY,•nameVARCHAR2(20),•ageNUMBER(3),•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男'•)•INSERTINTOperson(pid,name,age,birthday,sex)VALUES('111111111111111111','张三',30,TO_DATE('1976-3-24','YYYY-MM-DD'),'女')•INSERTINTOperson(pid,name,age,birthday,sex)VALUES('111111111111111111','李四',26,TO_DATE('1985-3-24','YYYY-MM-DD'),'男')•INSERTINTOperson(name,age,birthday,sex)VALUES('王五',26,TO_DATE('1985-3-24','YYYY-MM-DD'),'男')使用关键字constraint对约束命名•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20),•ageNUMBER(3),•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男‘•constraintperson_pid_name_pkprimarykey(pid)•)(2)非空约束(NOTNULL)•使用非约束表示一个字段不允许为空,即:插入、修改数据的时候必须有具体的内容•例:建立person表,并指定字段name,age为非空约束•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20)NOTNULL,•ageNUMBER(3)NOTNULL,•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男',•CONSTRAINTperson_pid_pkPRIMARYKEY(pid)•)(3)唯一约束(UNIQUE)•表示一个字段中的内容是唯一的,不允许重复。•例:建立表person,并为name指定唯一约束•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20)UNIQUENOTNULL,•ageNUMBER(3)NOTNULL,•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男',•CONSTRAINTperson_pid_pkPRIMARYKEY(pid)•)CONSTRAINT对约束命名•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20)NOTNULL,•ageNUMBER(3)NOTNULL,•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男',•CONSTRAINTperson_pid_pkPRIMARYKEY(pid),•CONSTRAINTperson_name_ukUNIQUE(name)•)CONSTRAINT约束多个字段•例子:要求email和名字的组合值不能重复•createtablestu•(•idnumber(6)primarykey,•namevarchar2(20)constraintstu_name_nnnotnull,•…•emailvarchar2(50),•constraintstu_email_uniunique(name,email)•);(4)检查约束(CHECK)•使用检查约束来判断一个列中插入的内容是否合法•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20)NOTNULL,•ageNUMBER(3)NOTNULLCHECK(age=0ANDage=150),•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男'CHECK(sexIN('男','女')),•CONSTRAINTperson_pid_pkPRIMARYKEY(pid),•CONSTRAINTperson_name_ukUNIQUE(name)•)CONSTRAINT命名•CREATETABLEperson•(•pidVARCHAR2(18),•nameVARCHAR2(20)NOTNULL,•ageNUMBER(3)NOTNULL,•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男',•CONSTRAINTperson_pid_pkPRIMARYKEY(pid),•CONSTRAINTperson_name_ukUNIQUE(name),•CONSTRAINTperson_age_ckCHECK(age=0ANDage=150),•CONSTRAINTperson_sex_ckCHECK(sexIN('男','女'))•);(5)主—外键约束(FOREIGNKEY)•主-外键约束建立于一张表的两个字段或两张表的两个字段上•子表外键字段的值必须在参照字段的取值中存在•如果字段的值被别的字段参照时,记录不允许被删除•外键约束被参考的字段必须是主键例1:实现一个成绩记录对应一个学生记录•建立学生表:•CREATETABLEstu•(•snoVARCHAR2(6),•nameVARCHAR2(20)NOTNULL,•ageNUMBER(3)NOTNULL,•birthdayDATE,•sexVARCHAR2(2)DEFAULT'男',•CONSTRAINTstu_no_pkPRIMARYKEY(sno),•CONSTRAINTsut_age_ckCHECK(ageBETWEEN0AND150),•CONSTRAINTsut_sex_ckCHECK(sex='男'ORsex='女')•)•建立成绩表•CREATETABLEscore•(•snoVARCHAR2(6)NOTNULLREFERENCESstu(sno),•cnoVARCHAR2(2)NOTNULL,•resultNUMBER(6,2)NOTNULL,•)CONSTRAINT•建立成绩表•CREATETABLEscore•(•snoVARCHAR2(6)NOTNULL,•cnoVARCHAR2(2)NOTNULL,•resultNUMBER(6,2)NOTNULL,•CONSTRAINTscore_stu_sno_fkFOREIGNKEY(sno)REFERENCESstu(sno)•)数据的添加、删除•指定主-外键级联删除•CREATETABLEscore•(•snoVARCHAR2(6)NOTNULL,•cnoVARCHAR2(2)NOTNULL,•resultNUMBER(6,2)NOTNULL,•CONSTRAINTscore_stu_sno_fkFOREIGNKEY(sno)REFERENCESstu(sno)ONDELETECASCADE•)•如果希望一个表中的数据删除时,可以自动删除其对应子表中的记录,则可以使用级联约束的添加、删除•ALTERTABLE表名称ADDCONSTRAINT约束名称约束类型(约束字段)•ALTERTABLE表名称DROPCONSTRAINT约束名称约束类型(约束字段)例子•CREATETABLEbook•(•bidNUMBER,•bnameVARCHAR2(30),•bpriceNUMBER(10),•pidVARCHAR2(10)•)为book表添加主键(bid)和外键(pid)•ALTERTABLEbookADDCONSTRAINTbook_bid_pkPRIMARYKEY(bid)•ALTERTABLEbookADDCONSTRAINTperson_book_pid_fkFOREIGNKEY(pid)REFERENCESperson(pid)ONDELETECASCADE删除BOOK的约束•删除book中的pid上的外键•ALTERTABLEbookDROPCONSTRAINTperson_book_pid_fk;•删除person表中的主键•SQLALTERTABLEpersonDROPCONSTRAINTperson_pid_pk;思考•scott用户下的emp和dept表,实际上这两张表也是主-外键关联的,请描述关联情况•触发器实现复杂约束PL/SQL基础学习后再介绍事务处理•观察发生的现象•第一步:根据emp表,建立一个名为test的表,要求test中内包含部门编号为10的雇员信息•CREATETABLEtestAS•SELECT*FROMempWHEREdeptno=10•第二步:查看test表中的全部信息•SELECT*FROMtest•第三步:删除雇员姓名为KING的雇员信息•DELETEFROMtestWHEREename='KING'•第四步:再次查询test表中的全部信息•SELECT*FROMtest;•第五步:从开始/运行一个新的sqlplus窗口,连接数据库后•SELECT*FROMtest;•一个session对数据库所做的修改,不会立刻反映到数据库的真实数据库之上,是允许回滚的,当一个session提交所有的操作之后,数据库才真正的作出修改事务处理两个主要命令•提交事务:commit•回滚事务:rollback•一个事务起始于一个DML语句,结束于rollback(回滚)或commit(提交)。•当一个DML语句(INSERT、UPDATE、DELETE)遇到下一个DDL(CREATE、DROP、ALTER)或DCL(GRANT、REVOKE、COMMIT、ROLLBACK)时自动提交。•当Oracle正常退出时执行commit(提交),非正常退(如系统崩溃或断电时事务自动回退。)出执行rollback(回滚)。并发控制•一致性问题数据的修改并行操作的发生•最常用的措施是对数据进行封锁•封锁机制:数据封锁字典封锁内部封锁建表、约束训练题目背景:•某大学生运动会比赛信息数据库,保存如下几个表•运动员sporter(运动员编号sproterid,运动员姓名name,运动员性别sex,所属系号department)•项目item(项目编号itemid,项目名称itemname,项目比赛地点location)•成绩grade(运动员编号sporterid,项目编号itemid,积分mark)建表要求•定义各个表的主码和外码约束•运动员的姓名和所属系别不能为空值•积分要么为空值,要么为6,4,2,0,分别代表第一,二,三名和其他名次的积分模拟数据运动员表•1001李明男计算机系•1002张三男数学系•1003李四男计算机系•1004王二男物理系•1005李娜女心理系•1006孙丽女新闻系项目•x001男子五千米一操场•x002男子标枪一操场•x004女子跳高二操场•x005女子三千米二操场成绩表•1001x0016•1

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功