首页计算机计算机软件空间数据库与SQL 06 第6章 索引与数据完整性.pptx

06 第6章 索引与数据完整性.pptx

页数:55页文件大小:1.30 MB来源: 空间数据库与SQLppt课件

本课件先说明索引的作用与分类,演示界面与命令两种方式的索引创建、查看与删除,随后围绕域完整性、实体完整性和参照完整性,讲解各类约束与规则、默认对象的定义方法。

6.1索引章节封面,标示本章主题与所涵盖的小节:6.1索引;6.2数据完整性
索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表
聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致
查看本课件的文字版(共 55 页,供检索与复制)

第1页:6.1 索引

6.1索引6.2数据完整性

第2页:索引是根据表中一列

索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。在数据库系统中建立索引主要有以下作用:快速存取数据;保证数据记录的唯一性;实现表与表之间的参照完整性;在使用ORDER BY、GROUP BY子句进行数据检索时,利用索引可以减少排序和分组的时间。

第3页:1.聚集索引

1.聚集索引聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致。SQL Server 2008是按B树(BTREE)方式组织聚集索引的,B树方式构建为包含了多个节点的一棵树。顶部的节点构成了索引的开始点,叫做根。

每个节点中含有索引列的几个值,一个节点中的每个值又都指向另一个节点或者指向表中的一行,一个节点中的值必须是有序排列的。指向一行的一个节点叫做叶子页。叶子页本身也是相互连接的,一个叶子页有一个指针指向下一组。这样,表中的每一行都会在索引中有一个对应值。查询的时候就可以根据索引值直接找到所在的行。聚集索引中B树的叶节点存放数据页信息。

聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表的哪个(或哪些)字段,这些字段都会按顺序保存在表中。由于存在这种排序,所以每个表只会有一个聚集索引。由于数据记录按聚集索引键的次序存储,故聚集索引对查找记录很有效。

第4页:2.非聚集索引

2.非聚集索引非聚集索引完全独立于数据行的结构。SQL Server 2008也是按B树方式组织非聚集索引的,与聚集索引的不同之处在于:非聚集索引B树的叶节点不存放数据页信息,而是存放非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。在非聚集索引内,从索引行指向数据行的指针称为行定位器。

行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。只有在表上创建聚集索引时,表内的行才按特定顺序存储,这些行按聚集索引键顺序存储。如果一个表只有非聚集索引,则它的数据行将按无序的堆集方式存储。

第5页:三表索引建立方案

在PXSCJ数据库中,经常要对XSB、KCB、CJB三个表进行查询和更新。为了提高查询和更新速度,可以考虑对三个表建立如下索引:

  • 对于XSB表,按学号建立主键索引(PRIMARY KEY),组织方式为聚集索引。
  • 对于KCB表,按课程号建立主键索引,组织方式为聚集索引。
  • 对于KCB表,按课程名建立唯一索引(UNIQUE约束),组织方式为非聚集索引。
  • 对于CJB表,按学号+课程号建立唯一索引,组织方式为聚集索引。在SQL Server Management Studio中,既可利用界面方式创建上述索引,也可以利用T-SQL命令通过查询分析器建立索引。

第6页:1.界面方式

1.界面方式创建索引启动“SQL Server Management Studio”,在对象资源管理器中展开“数据库”,选择“表”中的“dbo.XSB”,右击其中的“索引”项,在弹出的快捷菜单上选择“新建索引(N)…”菜单项。

这时,用户可以在弹出的“新建索引”窗口中输入索引名称(索引名在表中必须唯一),如PX_XSB,选择索引类型为“聚集”,勾选“唯一”复选框,单击新建索引窗口的“添加”按钮,在弹出的“选择要添加到索引键的表列”窗口(如图6.1所示)中选择要添加的列,添加完毕后,单击“确定”按钮,在主界面中为索引键列设置相关的属性,单击“确定”按钮,即完成索引的创建工作。

第7页:图6.1 添加索引键列

图6.1添加索引键列

第8页:用表设计器创建索引

在“表设计器”窗口创建索引的方法如下。第1步:右击PXSCJ数据库中的“dbo.XSB”表,在弹出的快捷菜单中选择“设计”菜单项,打开“表设计器”窗口。第2步:在“表设计器”窗口中,选择“学号”属性列,右击鼠标,在弹出的快捷菜单中选择“索引/键”菜单项。

在打开的“索引/键”窗口中单击“添加”按钮,并在右边的“标识”属性区域的“名称”一栏中确定新索引的名称(用系统默认的名或重新取名)。在右边的常规属性区域中的“列”一栏后面单击“”按钮,可以修改要创建索引的列。如果将“是唯一的”一栏设定为“是”则表示索引是唯一索引。

在“表设计器”栏下的“创建为聚集的”选项中,可以设置是否创建为聚集索引,由于XSB表中已经存在聚集索引,所以这里的这个选项不可修改,如图6.2所示。图6.2“索引/键”窗口

第9页:第3步:最后关闭

第3步:最后关闭该窗口,单击面板上的“保存”按钮,在弹出的对话框中单击“是”按钮,索引创建即完成。索引创建完后,只需返回SSMS主窗口,在对象资源管理器中展开“dbo.XSB”表中的“索引”项,就可以查看已建立的索引。其他索引的创建方法与之类似。

第10页:2.CREATE INDEX建立索引

2.利用SQL命令建立索引使用CREATE INDEX语句可以为表创建索引。

语法格式:CREATE [ UNIQUE ][ CLUSTERED | NONCLUSTERED ]INDEX index_nameON {[ database_name. [ schema_name ] . | schema_name. ]table_or_view_name}( column [ ASC | DESC ] [ ,...n ] )[ INCLUDE ( column_name [ ,...n ] ) ][ WHERE column_name IN (constant ,…)| column_name <comparison_op> constant ][ WITH ( <relational_index_option> [ ,...n ] ) ][ ON { partition_scheme_name ( column_name )| filegroup_name| default}][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ ; ]

第11页:索引选项说明

其中,<relational_index_option> ::={PAD_INDEX = { ON | OFF }| FILLFACTOR = fillfactor| SORT_IN_TEMPDB = { ON | OFF }| IGNORE_DUP_KEY = { ON | OFF }| STATISTICS_NORECOMPUTE = { ON | OFF }| DROP_EXISTING = { ON | OFF }| ONLINE = { ON | OFF }| ALLOW_ROW_LOCKS = { ON | OFF }| ALLOW_PAGE_LOCKS = { ON | OFF }| MAXDOP = max_degree_of_parallelism}

第12页:【例6.1】创建课程名索引

【例6.1】为

为KCB表的“课程名”列创建索引。 USE PXSCJ GO CREATE INDEX kc_name_ind ON KCB(课程名)

【例6.2】根据

根据KCB表的“课程号”列创建唯一聚集索引,因为指定了CLUSTERED,所以该索引将对磁盘上的数据进行物理排序。 CREATE UNIQUE CLUSTERED INDEX kc_id_ind ON KCB (课程号)

第13页:【例6.3】根据

【例6.3】根据

根据CJB表的“学号”列和“课程号”列创建复合索引。 CREATE INDEX CJB_ind ON CJB(学号,课程号) WITH(DROP_EXISTING= ON)

【例6.4】根据

根据XSB表中的“总学分”列创建索引,例中使用了FILLFACTOR子句。 CREATE NONCLUSTERED INDEX score_ind ON XSB(总学分) WITH FILLFACTOR = 60

【例6.5】根据

根据XSB表中“学号”列创建唯一聚集索引。如果输入了重复的键,将忽略该INSERT或UPDATE语句。 CREATE UNIQUE CLUSTERED INDEX xs_ind ON XSB(学号) WITH IGNORE_DUP_KEY

第14页:创建索引的注意事项

创建索引有如下几点要说明:

  • 在计算列上创建索引。对于UNIQUE或PRIMARY KEY索引,只要满足索引条件,就可以包含计算列,但计算列必须具有确定性,必须精确。若计算列中带有函数,则使用该函数时有相同的参数输入,输出的结果也一定相同时,该计算列是确定的。而有些函数,如getdate(),每次调用时都输出不同的结果,这时就不能在计算列上定义索引。计算列为text、ntext或image列时也不能在该列上创建索引。
  • 在视图上创建索引。可以在视图上定义索引。索引视图是一种在数据库中存储视图结果集的方法,可减少动态生成结果集的开销。索引视图还能自动反映出创建索引后对基表数据所做的修改。

第15页:【例6.6】创建一个视图

【例6.6】创建一个视图

创建一个视图,并为该视图创建索引。CREATE VIEW View_stu WITH SCHEMABINDINGASSELECT学号,姓名FROM dbo.XSB GO CREATE UNIQUE CLUSTERED INDEX Inx1 ON View_stu(学号) GO

第16页:索引使用一段时间后

索引使用一段时间后,可能需要重新创建,这时可以使用ALTER INDEX语句来重新生成原来的索引。

语法格式:ALTER INDEX { index_name | ALL }ON [ database_name. [ schema_name ] . | schema_name. ]table_or_view_name{ REBUILD[ [ WITH ( <rebuild_index_option> [ ,...n ] ) ]| [ PARTITION = partition_number[ WITH ( <single_partition_rebuild_index_option> [ ,...n ] )] ]]| DISABLE| REORGANIZE[ PARTITION = partition_number ][ WITH ( LOB_COMPACTION = { ON | OFF } ) ]| SET ( <set_index_option> [ ,...n ] )}[ ; ]

第17页:ALTER INDEX索引选项

其中,<rebuild_index_option >、<single_partition_rebuild_index_option>、<set_index_ option>中的选项含义与CREATE INDEX中的选项相同。

例如,重建KCB表上的所有索引:USE PXSCJGOALTER INDEX ALL ON KCB REBUILD重建KCB表上的kc_name_id索引:ALTER INDEX kc_name_ind ON KCB REBUILD

第18页:1.通过图形界面方式

1.通过图形界面方式删除索引通过图形界面方式删除索引的主要步骤如下:启动SQL Server Management Studio,在对象资源管理器中展开数据库“PXSCJ→表→dbo.XSB→索引”,选择其中要删除的索引,单击鼠标右键,在弹出的快捷菜单上选择“删除”菜单项。在打开的“删除对象”窗口中单击“确定”按钮即可。

2.通过SQL命令删除索引从当前数据库中删除一个或多个索引。语法格式:DROP INDEX{ index_name ONtable_or_view_name [ ,...n ]| table_or_view_name.index_name [ ,...n ]}

第19页:DROP INDEX语句

DROP INDEX语句可以一次删除一个或多个索引。这个语句不适合删除通过定义PRIMARY KEY或UNIQUE约束创建的索引。若要删除PRIMARY KEY或UNIQUE约束创建的索引,必须通过删除约束实现。另外,在系统表的索引上不能进行DROP INDEX操作。

【例6.7】删除PXSCJ数据库中表

删除PXSCJ数据库中表KCB的一个索引名为kc_name_ind的索引。 IF EXISTS (SELECT name FROM sysindexes WHERE name = 'kc_name_ind') DROP INDEX KCB.kc_name_ind

第20页:6.2.1 数据完整性的分类

6.2.1数据完整性的分类数据完整性是指数据库中的数据在逻辑上的一致性和准确性。数据完整性一般包括三种。1.实体完整性实体完整性又称为行的完整性,要求表中有一个主键,其值不能为空且能唯一地标识对应的记录。通过索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性可实现数据的实体完整性。

例如,对于PXSCJ数据库中的XSB表,“学号”作为主键,每一个学生的学号能唯一地标识该学生对应的行记录信息,那么在输入数据时,则不能有相同学号的行记录。通过对学号这一字段建立主键约束可实现表XSB的实体完整性。

第21页:2.域完整性域完整性又

2.域完整性域完整性又称为列完整性,指给定列输入的有效性。实现域完整性的方法有:限制类型(通过数据类型)、格式(通过CHECK约束和规则)或可能的取值范围(通过CHECK约束、DEFALUT定义、NOT NULL定义和规则)等。

例如,对于学生数据库PXSCJ的KCB表,学生的总学分应在0~60之间,为了对“总学分”这一数据项输入的数据范围进行限制,可以在定义KCB表的同时定义学分的约束条件来达到这一目的。

【例6.8】建立表

建立表KCB2,同时定义总学分的约束条件为0~60。 CREATE TABLE KCB2(课程号char(6) NOT NULL,课程名char(8) NOT NULL,学分tinyint CHECK (学分>=0 AND学分<=60) NULL)

第22页:3.参照完整性

3.参照完整性参照完整性又称为引用完整性。参照完整性保证主表中的数据与从表(被参照表)中数据的一致性。在SQL Server 2008中,参照完整性的实现是通过定义外键与主键之间或外键与唯一键之间的对应关系来实现的。参照完整性确保键值在所有表中一致。码:即前面所说的关键字,又称为“键”,是能唯一标识表中记录的字段或字段组合。

如果一个表有多个码,可选其中一个作为主键(主码),其余的称为候选键。外码:如果一个表中的一个字段或若干个字段的组合是另一个表的码,则称该字段或字段组合为该表的外码(外键)。

例如,对于PXSCJ数据库中XSB表的每一个学号,在CJB表中都有相关的课程成绩记录,将XSB作为主表,“学号”字段定义为主键,CJB作为从表,表中的“学号”字段定义为外键,从而建立主表和从表之间的联系,实现参照完整性。XSB和CJB表的对应关系如表6.1和表6.2所示。

第23页:

第24页:定义了两个表之间

如果定义了两个表之间的参照完整性,则要求:

  • 从表不能引用不存在的键值。例如,CJB表中行记录出现的学号必须是XSB表中已存在的学号。
  • 如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。例如,如果对XSB表中的某一学号修改,则CJB表中所有对应学号也要进行相应的修改。
  • 如果主表中没有关联的记录,则不能将记录添加到从表。如果要删除主表中的某一记录,则应先删除从表中与该记录匹配的相关记录。

第25页:PRIMARY KEY约束

如果PRIMARY KEY约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY约束定义中所有列的组合值必须唯一。如果要确保一个表中的非主键列不输入重复值,则应在该列上定义唯一约束(UNIQUE约束)。

例如,对于PXSCJ数据库中的XSB表,“学号”列是主键,在XSB表中增加一列“身份证号码”,可以定义一个UNIQUE约束来要求表中“身份证号码”列的取值是唯一的。PRIMARY KEY约束与UNIQUE约束的主要区别如下:

  • 一个数据表只能创建一个PRIMARY KEY约束,但一个表中可根据需要对表中不同的列创建若干个UNIQUE约束。
  • PRIMARY KEY字段的值不允许为NULL,而UNIQUE字段的值可取NULL。
  • 一般在创建PRIMARY KEY约束时,系统会自动产生索引,索引的默认类型为簇索引。在创建UNIQUE约束时,系统会自动产生一个UNIQUE索引,索引的默认类型为非簇索引。

第26页:1.利用界面方式

1.利用界面方式创建和删除PRIMARY KEY约束

  • 创建PRIMARY KEY约束。如果要对XSB表按学号建立PRIMARY KEY约束,则可以按第3章创建表的第3步中所介绍的设置主键的相关步骤进行。当创建主键时,系统将自动创建一个名称以“PK_”为前缀、后跟表名的主键索引,系统自动按聚集索引方式组织主键索引。
  • 删除PRIMARY KEY约束。如果要删除表XSB中对“学号”字段建立的PRIMARY KEY约束,可按如下步骤进行:在对象资源管理器中选择dbo.XSB表图标,右击鼠标,在弹出的快捷菜单中选择“设计”菜单项,进入“表设计器”窗口。选中“XSB表设计器”窗口中主键所对应的行,右击鼠标,在弹出的快捷菜单中选择“删除主键”菜单项即可。

第27页:2.利用界面方式

2.利用界面方式创建和删除UNIQUE约束(1)创建UNIQUE约束。如果要对XSB表中的“学号”列创建UNIQUE约束,以保证该列取值的唯一性,可按以下步骤进行:进入XSB表的“表设计器”窗口,选择“学号”属性列并右击鼠标,在弹出的快捷菜单中选择“索引/键”菜单项,打开“索引/键”窗口。

在窗口中单击“添加”按钮,并在右边的“标识”属性区域的“名称”栏中输入唯一键的名称(用系统默认的名或重新取名)。在“常规”属性区域的“类型”栏中选择类型为“唯一键”,如图6.3所示。在“常规”属性区域中的“列”栏后面单击形状的按钮,选择要创建索引的列。在此选择“学号”列,并设置排列顺序。单击“关闭”按钮,然后保存修改即可。

第28页:图6.3 创建唯一键

图6.3创建唯一键(2)删除UNIQUE约束。打开如图6.3所示的“索引/键”窗口,选择要删除的UNIQUE约束,单击左下方的“删除”按钮,单击“关闭”按钮,保存表的修改即可。

第29页:3.T-SQL命令创建及删除

3.利用“T-SQL命令”创建及删除PRIMARY KEY约束或UNIQUE约束利用T-SQL命令可以使用两种方式定义约束:作为列的约束或作为表的约束。可以在创建表或修改表时定义。(1)在创建表的同时创建PRIMARY KEY约束或UNIQUE约束。

语法格式:CREATE TABLE table_name( { <列定义> <column_constraint>}[,…n][ <table_constraint> ] [ ,...n ] )

第30页:column_constraint>

其中,<column_constraint>为列的约束,<table_constraint>为表的约束。

<column_constraint> ::=[ CONSTRAINT constraint_name ]{ { PRIMARY KEY | UNIQUE }[ CLUSTERED | NONCLUSTERED ][WITH ( < index_option > [ , ...n ] )][ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ]| [ FOREIGN KEY ] <reference_definition>| CHECK [ NOT FOR REPLICATION ] ( logical_expression )}< table_constraint > ::=[ CONSTRAINT constraint_name ]{{ PRIMARY KEY | UNIQUE }[ CLUSTERED | NONCLUSTERED ](column [ ASC | DESC ] [ ,...n ] )[WITH ( <index_option> [ , ...n ] )][ ON { partition_scheme_name (partition_column_name) | filegroup | "default" } ]| FOREIGN KEY ( column [ ,...n ] ) <reference_definition>| CHECK [ NOT FOR REPLICATION ] ( logical_expression )}

第31页:【例6.9】创建XSB1表

【例6.9】创建XSB1表

创建XSB1表(假设XSB1表未创建),并对“学号”字段创建PRIMARY KEY约束,对“姓名”字段定义UNIQUE约束。 USE PXSCJ GO CREATE TABLE XSB1(学号char(6)NOT NULLCONSTRAINT XH_PK PRIMARY KEY,姓名char(8)NOT NULLCONSTRAINT XM_UK UNIQUE,性别bitNOT NULLDEFAULT 1,出生时间dateNOT NULL,专业char(12)NULL,总学分intNULL,备注varchar(500) NULL)

第32页:【例6.10】创建一个

【例6.10】创建一个

创建一个course_name表来记录每门课程的学生学号、姓名、课程号、学分和毕业日期。其中,学号、课程号和毕业日期构成复合主键,学分为唯一键。 CREATE TABLE course_name(学号varchar(6) NOT NULL,姓名varchar(8) NOT NULL,毕业日期dateNOT NULL,课程号varchar(3) ,学分tinyint,PRIMARY KEY (学号,课程号,毕业日期),CONSTRAINT XF_UK UNIQUE (学分))

第33页:(2)通过修改表

(2)通过修改表创建PRIMARY KEY约束或UNIQUE约束。使用ALTER TABLE语句中的ADD子句可以为表中已存在的列或新列定义约束,语法格式参见第3章中ALTER TABLE语句的ADD子句。

【例6.11】修改例

修改例6.14中的XSB1表,向其中添加一个“身份证号码”字段,对该字段定义UNIQUE约束。对“出生时间”字段定义UNIQUE约束。 ALTER TABLE XSB1ADD身份证号码char(20)CONSTRAINT SF_UKUNIQUE NONCLUSTERED (身份证号码) GO ALTER TABLE XSB1 ADDCONSTRAINT CJSJ_UK UNIQUE NONCLUSTERED (出生时间)

第34页:(3)删除PRIMARY KEY约束

(3)删除PRIMARY KEY约束或UNIQUE约束。删除PRIMARY KEY约束或UNIQUE约束需要使用ALTER TABLE的DROP子句。语法格式:ALTER TABLE table_nameDROP CONSTRAINT constraint_name [ ,...n ]

【例6.12】删除例

删除例6.14中创建的PRIMARY KEY约束和UNIQUE约束。 ALTER TABLE XSB1 DROPCONSTRAINT XH_PK, XM_UK GO

第35页:1.CHECK约束

1.CHECK约束的定义与删除CHECK约束实际上是字段输入内容的验证规则,表示一个字段的输入内容必须满足CHECK约束的条件,若不满足,则数据无法正常输入。(1)通过图形向导方式创建与删除CHECK约束。在PXSCJ数据库的CJB表中,学生每门功课的成绩一般在0~100的范围内。如果对用户的输入数据要施加这一限制,可按如下步骤进行。

第1步:启动“SQL Server Management Studio”,在对象资源管理器中展开“数据库→PXSCJ→表”,选择“dbo.CJB”,右击鼠标,在出现的快捷菜单中选择“设计”菜单项。第2步:在打开的“表设计器”窗口中选择“成绩”属性列,右击鼠标,在弹出的快捷菜单中选择“CHECK约束”菜单项。

第36页:第3步:在打开

第3步:在打开的“CHECK约束”窗口(如图6.4所示)中,单击“添加”按钮,添加一个CHECK约束。在“常规”属性区域中的“表达式”栏后面单击“”按钮(或直接在文本框中输入内容),打开“CHECK约束表达式”窗口,并编辑相应的CHECK约束表达式为“成绩>=0 AND成绩<=100”。图6.4“CHECK约束”窗口

第37页:第4步:单击

第4步:单击“确定”按钮,完成CHECK约束表达式的编辑,返回到“CHECK约束”窗口中。在“CHECK约束”窗口中选择“关闭”按钮,并保存修改,完成“CHECK约束”的创建。此时若输入数据,如果成绩不是在0~100的范围内,系统将报告错误。

如果要删除上述约束,只需进入如图6.4所示的“CHECK约束”窗口,选中要删除的约束,单击“删除”按钮删除约束,然后单击“关闭”按钮即可。

第38页:(2)建表时创建CHECK约束

(2)利用SQL语句在创建表时创建CHECK约束。在创建表时可以使用CHECK约束表达式来定义CHECK约束,具体语法格式参见6.2.2小节。

CHECK约束表达式语法格式如下:CHECK [ NOT FOR REPLICATION ] ( logical_expression )关键字CHECK表示定义CHECK约束,如果指定NOT FOR REPLICATION选项,则当复制代理执行插入、更新或删除操作时,将不会强制执行此约束。

其后的logical_expression逻辑表达式称为CHECK约束表达式,返回值为TRUE或FALSE,该表达式只能为标量表达式。

【例6.13】创建一个表

创建一个表student,只考虑“学号”和“性别”两列,性别只能包含男或女。 USE PXSCJ GO CREATE TABLE student(学号char(6) NOT NULL,性别char(1) NOT NULL CHECK(性别IN ('男', '女')))

第39页:【例6.14】创建一个表

【例6.14】创建一个表

创建一个表student1,只考虑“学号”和“出生日期”两列,出生日期必须大于1980年1月1日,并命名CHECK约束。 CREATE TABLE student1(学号char(6)NOT NULL,出生时间datetime NOT NULL,CONSTRAINT DF_student1_cjsj CHECK(出生时间>'1980-01-01'))

【例6.15】创建表

创建表student2,有“学号”、“最好成绩”和“平均成绩”三列,要求最好成绩必须大于平均成绩。 CREATE TABLE student2(学号char(6) NOT NULL,最好成绩INT NOT NULL,平均成绩INT NOT NULL,CHECK(最好成绩>平均成绩))

第40页:(3)改表时创建CHECK约束

(3)利用SQL语句在修改表时创建CHECK约束。在使用ALTER TABLE语句修改表时也能定义CHECK约束,ALTER TABLE语句的语法格式参见第3章。

定义CHECK约束的语法格式为ALTER TABLE table_name[ WITH { CHECK | NOCHECK } ] ADD[<column_definition>][CONSTRAINT constraint_name] CHECK (logical_expression)

【例6.16】通过修改

通过修改PXSCJ数据库的CJB表,增加“成绩”字段的CHECK约束。 USE PXSCJ GO ALTER TABLE CJBADD CONSTRAINT cj_constraint CHECK(成绩>=0 AND成绩<=100)

第41页:(4)删除CHECK约束

(4)利用SQL语句删除CHECK约束。CHECK约束的删除可在SQL Server Management Studio中通过界面进行,有兴趣的读者可以自己试一试,在此介绍如何利用SQL命令删除CHECK约束。使用ALTER TABLE语句的DROP子句可以删除CHECK约束。

语法格式:ALTER TABLE table_nameDROP CONSTRAINT check_name

【例6.17】删除

删除CJB表“成绩”字段的CHECK约束。 ALTER TABLE CJBDROP CONSTRAINT cj_constraint

第42页:2.规则对象

2.规则对象的定义、使用与删除规则是一组使用T-SQL语句组成的条件语句,规则提供了另外一种在数据库中实现域完整性与用户定义完整性的方法。规则对象的使用方法与默认值对象的使用步骤类似。①定义规则对象;②将规则对象绑定到列或用户自定义类型。在SQL Server 2008中,规则对象的定义可以利用CREATE RULE语句来实现。

(1)规则对象的定义。语法格式:CREATE RULE [ schema_name. ] rule_nameAS condition_expression[ ; ]

第43页:(2)将规则对象绑定

(2)将规则对象绑定到用户定义数据类型或列。将规则对象绑定到列或用户定义数据类型中可以使用系统存储过程sp_bindrule。

语法格式:sp_bindrule [ @rulename = ] 'rule' ,[ @objname = ] 'object_name'[ , [ @futureonly = ] 'futureonly_flag' ](3)应用举例。

【例6.18】如下程序

如下程序创建一个规则,并绑定到表KCB的课程号列,用于限制课程号的输入范围。 USE PXSCJ GO CREATE RULE kc_rule AS @range like '[1-5][0-9][0-9]' GO EXEC sp_bindrule 'kc_rule', 'KCB.课程号' GO 程序如果正确执行将提示:“已将规则绑定到表的列”。

第44页:【例6.19】创建一个规

【例6.19】创建一个规

创建一个规则,用以限制输入到该规则所绑定的列中的值只能是该规则中列出的值。 CREATE RULE list_rule AS @list IN ('C语言', '离散数学', '微机原理') GO EXEC sp_bindrule 'list_rule', 'KCB.课程名' GO

第45页:【例6.20】如下程序

【例6.20】如下程序

如下程序定义一个用户数据类型course_num,然后将前面定义的规则“kc_rule”绑定到用户数据类型course_num上,最后创建表KCB1,其课程号的数据类型为course_num。 CREATE TYPE course_num FROM char(3) NOT NULLEXEC sp_bindrule 'kc_rule', 'course_num' GO CREATE TABLE KCB1(课程号course_num,课程名char(16) NOT NULL,开课学期tinyint ,学时tinyint,学分tinyint) GO

第46页:(4)规则对象

(4)规则对象的删除。

在删除规则对象前,首先应使用系统存储过程sp_unbindrule解除被绑定对象与规则对象之间的绑定关系,使用格式如下:sp_unbindrule [@objname =] 'object_name'[, [@futureonly =] 'futureonly_flag']在解除列或自定义类型与规则对象之间的绑定关系后,就可以删除规则对象了。

语法格式:DROP RULE { [ schema_name . ] rule_name } [ ,...n ] [ ; ]

【例6.21】解除规

解除规则kc_rule与列或用户定义类型的绑定关系,并删除规则对象kc_rule。 EXEC sp_unbindrule 'KCB.课程号' EXEC sp_unbindrule 'course_num' GO DROP RULE kc_rule

第47页:1.利用界面

1.利用界面定义表间的参照关系例如,要实现XSB表与CJB表之间的参照完整性,操作步骤如下。第1步:按照前面所介绍的方法定义主表的主键。由于之前在创建表的时候已经定义XSB表中的“学号”字段为主键,所以这里就不需要再定义主表的主键了。

第2步:启动SQL Server Management Studio,在对象资源管理器中展开“数据库→PXSCJ”,选择“数据库关系图”,右击鼠标,在出现的快捷菜单中选择“新建数据库关系图”菜单项,打开“添加表”窗口。第3步:在出现的“添加表”窗口中选择要添加的表,本例中选择了表XSB和表CJB。

单击“添加”按钮完成表的添加,之后单击“关闭”按钮退出窗口。第4步:在“数据库关系图设计”窗口将鼠标指向主表的主键,并拖动到从表,即将XSB表中的“学号”字段拖动到从表CJB中的“学号”字段。

第48页:图6.5 设置参照完整性

第5步:在弹出的“表和列”窗口中输入关系名、设置主键表和列名,如图6.5所示,单击“表和列”窗口中的“确定”按钮,再单击“外键关系”窗口中的“确认”按钮。图6.5设置参照完整性

第49页:第6步:保存数据库关系图

第6步:进入如图6.6所示的界面,单击“保存”按钮,在弹出的“选择名称”对话框中输入关系图的名称。单击“确定”按钮,在弹出的“保存”对话框中单击“是”按钮,保存设置。图6.6主表和从表的参照关系图

第50页:图6.7 三个表之间的参照关系图

如果要在图6.6的基础上再添加KCB表并建立相应的参照完整性关系,可以使用以下步骤:右击图6.6中的空白区域,选择“添加表”菜单项,在随后弹出的“添加表”窗口中添加KCB表,之后定义CJB表和KCB表之间的参照关系,结果如图6.7所示。图6.7三个表之间的参照关系图

第51页:2.利用图形向导方式

2.利用图形向导方式删除表间的参照关系如果要删除前面建立的XSB表与CJB表之间的参照关系,可按以下步骤进行。第1步:在PXSCJ数据库的“数据库关系图”目录下选择要修改的关系图,如Diagram_0,右击鼠标,在弹出的快捷菜单中选择“修改”菜单项,打开“数据库关系图设计”窗口。

第2步:在“数据库关系图设计”窗口中,选择已经建立的“关系”,单击鼠标右键,选择“从数据库中删除关系”,如图6.8所示。在随后弹出的对话框中,单击“是”按钮,删除表之间的关系。图6.8删除关系

第52页:3.T-SQL命令定义表间的参照关系

3.利用“T-SQL命令”定义表间的参照关系前面已介绍了创建主键(PRIMARY KEY约束)及唯一键(UNIQUE约束)的方法,在此将介绍通过T-SQL命令创建外键的方法。(1)创建表的同时定义外键约束。语法格式在6.3.2小节中已经列出,这里只列出定义外键部分的语法。

CREATE TABLE table_name(<column_definition>[ CONSTRAINT constraint_name ][ FOREIGN KEY ][ ( column [ ,...n ] )] <reference_definition>)其中,<reference_definition>::=REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ][ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ NOT FOR REPLICATION ]

第53页:【例6.22】创建

【例6.22】创建

创建stu表,要求stu表中所有的学生学号都必须出现在XSB表中,假设已经使用“学号”列作为主键创建了XSB表。 USE PXSCJ GO CREATE TABLE stu(学号char(6) NOT NULLFOREIGN KEY (学号) REFERENCES XSB (学号),姓名char(8) NOT NULL,出生时间datetime NULL)

第54页:【例6.23】创建point表

【例6.23】创建point表

创建point表,要求表中所有的学号、课程号组合都必须出现在CJB表中。 CREATE TABLE point(学号char(6) NOT NULL,课程号char(3) NOT NULL,成绩int NULL,CONSTRAINT FK_point FOREIGN KEY (学号,课程号) REFERENCES CJB (学号,课程号) ON DELETE NO ACTION)(2)通过修改表定义外键约束。

【例6.24】假设

假设KCB表为主表,KCB的“课程号”字段已定义为主键。CJB表为从表,如下示例用于将CJB表的“课程号”字段定义为外键。 ALTER TABLE CJBADDCONSTRAINT kc_foreign FOREIGN KEY(课程号)REFERENCES KCB(课程号)

第55页:4.利用T-SQL命令

4.利用T-SQL命令删除表间的参照关系删除表间的参照关系,实际上删除从表的外键约束即可。语法格式与前面其他约束删除的格式类似。

【例6.25】删除上例

删除上例对CJB表的“课程号”字段定义的外键约束。 ALTER TABLE CJBDROP CONSTRAINT kc_foreign
顶部目录