您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 数据库原理B实验报告完整版4-6
实验四完整性日期2011-4-6一实验目的1.熟悉通过SQL对数据进行完整性控制。2.深入理解数据库系统的完整性概念。二、实验原理为维护数据库的完整性,DBMS必须:1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理Createtable语法中包含了对完整性的定义。CREATETABLE[database_name.[owner].|owner.]table_name({column_definition|column_nameAScomputed_column_expression|table_constraint::=[CONSTRAINTconstraint_name]}|[{PRIMARYKEY|UNIQUE}[,...n])[ON{filegroup|DEFAULT}][TEXTIMAGE_ON{filegroup|DEFAULT}]column_definition::={column_namedata_type}[COLLATEcollation_name][[DEFAULTconstant_expression]|[IDENTITY[(seed,increment)[NOTFORREPLICATION]]]][ROWGUIDCOL][column_constraint][...n]column_constraint::=[CONSTRAINTconstraint_name]{[NULL|NOTNULL]|[{PRIMARYKEY|UNIQUE}[CLUSTERED|NONCLUSTERED][WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]]]|[[FOREIGNKEY]REFERENCESref_table[(ref_column)][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}][NOTFORREPLICATION]]|CHECK[NOTFORREPLICATION](logical_expression)}table_constraint::=[CONSTRAINTconstraint_name]{[{PRIMARYKEY|UNIQUE}[CLUSTERED|NONCLUSTERED]{(column[ASC|DESC][,...n])}[WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]]|FOREIGNKEY[(column[,...n])]REFERENCESref_table[(ref_column[,...n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}][NOTFORREPLICATION]|CHECK[NOTFORREPLICATION](search_conditions)}三、实验仪器和设备1.计算机2.SQLServer2000四、预习要求复习完整性相关的SQL语句的基本语法。五、实验内容及步骤1.实体完整性定义表的主码关系模型的实体完整性在CREATETABLE中用PRIMARYKEY定义。定义主码的方法分为定义为列级约束条件和定义为表级约束条件两种。[例4-1]定义表Student,并将其中的Sno属性定义为主码。CREATETABLESTUDENT(SNOCHAR(7)PRIMARYKEY,SNAMECHAR(8)NOTNULL,SSEXCHAR(2),SAGESMALLINT,SDEPTCHAR(20));[例4-2]定义表SC,将其中的属性Sno,Cno定义为主码。对于多个属性构成的码,只能够将其定义为表级约束条件,而无法用列级约束条件来实现。CREATETABLESC(SNOCHAR(7)NOTNULL,CNOCHAR(4)NOTNULL,GRADESMALLINT,PRIMARYKEY(SNO,CNO));2.参照完整性定义表的外码关系模型的参照完整性是在CREATETABLE中用FOREIGNKEY语句来定义的,并用REFERENCES来指明外码参照的是哪些表的主码。定义表SC,其中Sno参照表Student的主码Sno,Cno参照表Course的主码Cno。CREATETABLESC(SNOCHAR(7)NOTNULL,CNOCHAR(4)NOTNULL,GRADESMALLINT,PRIMARYKEY(SNO,CNO),FOREIGNKEY(SNO)REFERENCESSTUDENT(SNO),FOREIGNKEY(CNO)REFERENCESCOURSE(CNO));3.用户定义完整性用户定义的属性上的约束条件[例6-1]列值非空。在定义SC表时,Sno、Cno和Grade属性都不允许取空值。在不特别声明的情况下,非码属性的值是允许取空值的。CREATETABLESC(SNOCHAR(7)NOTNULL,/*列值非空的约束NOTNULL*/CNOCHAR(4)NOTNULL,GRADESMALLINTNOTNULL);[例6-2]列值唯一。建立部门表DEPT,要求部门名称Dname取值唯一,部门编号Deptno属性为主码。CREATETABLEDEPT(DEPTNONUMERIC(7)PRIMARYKEY,DNAMEVARCHAR(9)UNIQUE,/*UNIQUE约束要求Dname取值唯一*/LOCATIONVARCHAR(10));[例6-3]CHECK短语指定列值应该满足的条件。定义表Student,属性Ssex的值只允许取“男”或“女”;定义表SC,属性Grade的值定义在0-100之间。CREATETABLESTUDENT(SNOCHAR(7)PRIMARYKEY,SNAMECHAR(8)NOTNULL,SSEXCHAR(2)CHECK(SSEXIN(‘男’,’女’)),/*CHECK语句约束条件*/SAGESMALLINT,SDEPTCHAR(20));CREATETABLESC(SNOCHAR(7)NOTNULL,CNOCHAR(4)NOTNULL,GRADESMALLINTCHECK(GRADE0ANDGRADE100),/*CHECK语句约束条件*/PRIMARYKEY(SNO,CNO),FOREIGNKEY(SNO)REFERENCESSTUDENT(SNO),FOREIGNKEY(CNO)REFERENCESCOURSE(CNO));用户定义的元组上的约束条件CHECK短语不光能够定义属性列上的约束条件,还允许用户定义元组级的约束条件。定义表Student,要求当学生性别为男时,其名字不能以Ms.打头。CREATETABLESTUDENT(SNOCHAR(7)PRIMARYKEY,SNAMECHAR(8)NOTNULL,SSEXCHAR(2),SAGESMALLINT,SDEPTCHAR(20),CHECK(SSEX=‘女’ORSNAMENOTLIKE‘Ms.%’));/*定义了Sname和Ssex之间的约束条件*/4.CONSTRAINT完整性约束命名子句。在定义表时利用约束命名子句对完整性约束条件命名,能够灵活地增加或删除一个完整性约束条件。[例8-1]定义表Student,要求学号在90000-99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。要求全部用约束命名子句实现。CREATETABLESTUDENT(SNONUMERIC(5)CONSTRAINTC1CHECK(SNOBETWEEN90000AND99999),SNAMEVARCHAR(20)CONSTRAINTC2NOTNULL,SAGENUMERIC(3)CONSTRAINTC3CHECK(SAGE30),SSEXVARCHAR(2)CONSTRAINTC4CHECK(SSEXIN(‘男’,’女’)),CONSTRAINTStudentKeyPRIMARYKEY(SNO));在表Student上共定义了5个约束条件,包括主码约束以及C1、C2、C3、C4四个列级约束。[例8-2]修改表Student中的完整性限制,去掉对性别的限制,并将年龄的限制由小于30改为小于40。ALTERTABLESTUDENT/*去掉对性别的限制条件C4*/DROPCONSTRAINTC4;ALTERTABLESTUDENT/*先删掉原来的约束条件再增加一个新的约束条件*/DROPCONSTRAINTC3;ALTERTABLESTUDENTADDCONSTRAINTC3CHECK(SAGE40);5.触发器。触发器可以看成是一类特殊的存储过程,在满足某个特定条件时自动触发执行,是提高数据库服务器性能的有力工具。触发器分为三类,更新触发器、插入触发器和删除触发器。能够定义触发器的用户有:1)表的所有者;2)系统管理员;3)拥有创建触发器的权限,且拥有对操作对象的相应的操作权限的用户。定义表TAB,并在其上定义触发器TRI,在对TAB的插入和更新前检查,如果插入或更新的值在100-1000之间的话,将值置为50;如果值大于1000的话,则给出新值不允许大于1000的提示。CREATETABLEtab(colint);INSERTINTOtabVALUES(10);INSERTINTOtabVALUES(20);CREATETRIGGERtriBEFOREUPDATEORINSERTONtabFOREACHROWASBEGINIFnew.col100ANDnew.col1000THENnew.col:=50;ENDIF;IFnew.col1000THENRAISEEXCEPTION‘Newvaluescannotmorethan1000’;ENDIF;END;检测:1)向表TAB插入数据(150)执行:INSERTINTOTABVALUES(150);结果:插入的数据为150。值在100-1000之间,触发器TRI自动执行,将插入的值置为50。2)对表中的数据进行更新,将20更新为1500。执行:UPDATETABSETCOL=1500WHERECOL=20;结果:系统报出‘Newvaluescannotmorethan1000’的错误,对表进行查询后发现,表中的数据并没有发生改变。说明在更新数据时,值大于1000则触发触发器TRI自动执行,系统报错,更新无效。删除触发器TRI。DROPTRIGGERTRIONTAB;删除触发器TRI之后,在对TAB进行插入和更新就不再有以上限制了。六、心得感受通过本次实验,我懂得了数据库的完整性语句的书写,熟悉了通过SQL对数据进行完整性控制的过程,从而深入理解数据库系统的完整性概念,为以后学习和工作奠定了基础。实验五通过嵌入式SQL访问数据库日期2011-4-13一、实验目的熟悉通过嵌入式SQL编程访问数据库。二、实验原理将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句。(1)SQL语句描述性的面向集合的语句负责操纵数据库(2)高级语言语句过程性的面向记录的语句负责控制程序流程执行过程:1.由DBMS的预处理程序对源程序进行扫描,识别出SQL语句2.把它们转换成主语言调用语句,以使主语言编译程序能识别它3.最后由主语言的编译程序将整个源程序编译成目标码。三、实验仪器和设备1.计算机2.SQLServer2000四、预习要求嵌入式SQL语句的基本用法。五、实验内容及步骤1.查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中。EXECSQLBEGINDECLARESECTION;/*说明主变量deptname,HSno,HSname,*HSsex,HSage,NEWAGE。*/Chardeptname[20];charHSno[9];charHSname[20];charHSsex[2];int
本文标题:数据库原理B实验报告完整版4-6
链接地址:https://www.777doc.com/doc-5841201 .html