第 4 部分IDS 表视图和索引.docx
- 文档编号:6899243
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:40
- 大小:40.73KB
第 4 部分IDS 表视图和索引.docx
《第 4 部分IDS 表视图和索引.docx》由会员分享,可在线阅读,更多相关《第 4 部分IDS 表视图和索引.docx(40页珍藏版)》请在冰豆网上搜索。
第4部分IDS表视图和索引
开始之前
本教程介绍可以在数据库中创建和使用的对象。
这些对象有的用于保存原始数据,有的纯粹是为了改善性能,还有些用于帮助维护数据的完整性。
本教程讨论到的对象包括表、视图、索引、触发器、限制、同义词和序列。
本教程还简单地探讨了这些对象的用途和如何创建它们。
在本教程的末尾,简单讨论了一个内置的工具,它能够输出帮助重新创建和复制对象的SQL语句。
关于本系列
这个免费的共包含9篇教程的教程系列的目的是为了帮助您准备InformixDynamicServer(IDS)基础认证考试(555)。
这个认证将考察关于IDS11.50管理的入门级知识,包括基础SQL、如何安装IDS11.50、如何创建数据库和数据库对象、安全性、事务隔离、备份和恢复流程,以及数据复制技术。
这些教程为考试的每部分打下了坚实的基础。
不过,您不能仅使用这些教程作为唯一的考试准备材料。
回页首
关于本教程
本教程讨论的主题与考试的第4部分“IDS表、视图和索引”对应。
回页首
目标
完成本教程之后,您应该能够:
∙解释数据库表的用途,以及如何创建数据库表
∙解释非片段表、片段表和分区表之间的区别
∙描述是什么限制,以及能够在Informix数据库中使用的不同类型的限制
∙解释如何在数据库中创建限制
∙描述视图的概念,解释视图与表的区别
∙解释如何创建视图
∙描述索引在数据库中扮演的角色,以及如何创建它们
∙解释什么是同义词和序列,以及如何创建它们
∙描述什么是数据库触发器,以及如何创建它们
InformixDynamicServer11.50基础考试555认证准备,第4部分:
检查数据库对象
表、限制、视图、索引、触发器、序列和同义词
简介:
本教程讨论可以在数据库中创建和使用的各种对象,这是IBM®Informix®DynamicServer之旅的一站。
这些对象包括表、索引、触发器和视图等。
本教程讨论这些对象的定义、使用方法和创建方法。
∙解释如何输出数据库中的对象的SQL语句(模式)
回页首
先决条件
本教程针对需要进一步提高自己的数据库管理员。
尽管具备基础的数据库知识有所帮助,但不是必要的。
回页首
系统需求
在学习本教程的过程中,您不需要安装IDS。
不过,如果您有IDS,将能从本教程学到更多东西。
如果您还没有安装IDS,可以下载免费的试用版(见参考资料)。
对象列表
讨论了数据库之后,我们继续探讨可以在数据库中创建供用户使用的对象。
表1描述了本教程将要讨论的对象。
尽管这还不是数据库中包含的所有对象,但是将帮助您熟悉一部分对象。
表1.对象及其说明
对象
说明
表
以行和列的格式储存数据
限制
限制数据值以保持数据库的完整性
视图
虚拟表
索引
用于从表获取数据的访问方法
触发器
对数据库中发生的事件的自动响应
序列
生成唯一整数的数据库对象
同义词
现有表、视图或序列对象的代替名称
表
如本系列教程的InformixDynamicServer11.50基础考试555认证准备,第1部分:
IDS计划和安装所述,表类似于以行和列存储数据的电子表格。
每个列描述表存储的一条数据,而每个行包含关于表的主题的特定实例的一些数据。
CREATETABLESQL语句用于创建表。
CREATETABLE语句的语法包含很多选项,可能变得很复杂,因此本教程不介绍该语法,但提供一些使用该语法的不同子句的例子。
CREATETABLE语句的最简单形式是创建一个仅包含基础列的表。
清单1.创建一个包含基础列的表
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
);
这个例子创建一个包含4个列的名为'customer'的表:
'SSN'、'LName'、'Age'和'Birthday'。
注意列的定义,它是一个包含在一对圆括号中并以逗号分隔的列表。
清单2中的例子添加了一个储存子句。
如本系列的InformixDynamicServer11.50基础考试555认证准备:
第3部分:
DBMS实例和存储对象所述,表存储在dbspace中。
因此该储存子句列出将要创建表的dbspace的名称。
清单2.储存子句
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
INdbspace1;
下一个例子(清单3)添加确定大小的属性。
表中的实际数据储存在称为Informix‘页’的磁盘空间中。
Informix页与O/S磁盘页不同。
Informix页是Informix执行磁盘读写时采用的I/O机制。
Informix页的大小在2K到16K之间。
尽管数据存储在页上,IDS不希望一个表的各个页分散到整个磁盘中,因此IDS使用了一个称为区段(extent)的机制。
区段是指相邻的页的集合。
因此表的大小可以指定希望在一个区段中包含多少个页。
默认情况下,区段的大小为8页。
IDS允许DBA指定分配给表的第一个区段的大小,以及分配给表的其他区段的大小。
当表的第一个区段已满时,将给它分配第二个区段。
当表的第一个和第二个区段已满时,将给它分配第三个区段。
IDS根据表数据需要的页的增加相应地增加区段。
注意:
磁盘上的区段是以页为单位的,但是在定义了区段之后,DBA以千字节为单位调整它们的大小。
因此,了解您的系统上的Informix页的大小非常重要。
对于大部分UNIX和Linux32位系统,默认的页大小为2K。
对于UNIX和Linux64位系统,以及Windows系统,默认的页大小为4K。
您还可以指定非默认的页大小。
清单3中的例子创建了一个表,假设Informix页大小为4K,它的第一个区段可以包含50个页,第二个区段可以包含25个页:
清单3.调整大小的属性
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
EXTENTSIZE200NEXTSIZE100;
下一个例子(清单4)使用了称为lockmode的子句。
当用户尝试更新表中的行时,必须在需要更新的区域上放置一个锁,从而使另一个用户不能在此期间更新该区域。
默认情况下,表放置了一个lockmodepage锁,这表明锁定的区域为整个表。
由于一个页可能包含多个行,因此即使用户仅需要更新该页的某个行,在更新期间都会锁定该页的所有行,此时其他用户不能访问该页。
DBA可以将锁定区域更改为lockmoderow。
如果表放置了lockmoderow锁,正在执行更新的用户仅锁定了他所更新的行,其他更新用户可以访问页上的其他行。
清单4中的例子添加了一个lockmoderow子句;lockmodepage子句是可以替换的。
清单4.lockmoderow子句
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
LOCKMODEROW;
每种锁模式都有其优点和缺点。
要详细了解锁,请阅读InformationCenter的Administration主题的“Locking”部分(见参考资料)。
片段/分区表
默认情况下,表在创建之后必须完全位于一个dbspace中。
它所在的dbspace可以由服务器分配给它,或在CREATETABLESQL语句中通过IN子句指定(见上面的清单2)。
必须位于一个dbspace中给表带来了几个限制,包括大小限制。
要实现更大的表,您可以创建片段表。
这些特殊的表打破了位于一个dbspace中的规则,它允许表的各个部分(片段)位于两个以上的dbspace中。
默认情况下表是不分成片段的,需要DBA显式地将其划分成片段。
可以通过两种方式之一将表划分成片段:
∙通过循环——将行均匀地分布到列出的片段中
∙通过表达式——指定一个将表放置到适当的片段的表达式
注意:
片段表在每个dbspace上只能有一个片段,因此必须为表的每个片段指定一个dbspace名。
清单5显示了DBA如何通过循环片段法创建一个新的表,从而将表分布在3个dbspace中。
清单5.基于循环片段法创建的新表
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
FRAGMENTBYROUNDROBININdbs1,dbs2,dbs3;
清单6显示了DBA使用基于表达式的片段创建的新表。
当每次查询表以确定需要访问哪个片段时将计算表达式。
清单6.基于表达式的片段
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
FRAGMENTBYEXPRESSION
(Age>50)INdbs1
(Age<51)indbs2;
在清单6的表达式中,Age列的值决定数据位于哪个片段中。
如果Age=28,那么将使用dbs1中的片段存储行,因为28>50。
由于每个dbspace仅能包含表的一个片段,因此CREATETABLESQL语句使用dbspace名称来识别表片段。
清单5和清单6中的例子仅是一个开始。
基于循环片段的表的片段数量可以与实例中定义的dbspace一样多。
基于表达式的片段表也可以拥有很多片段,并且可以根据需要使用更加复杂的表达式。
使用更加复杂的表达式的一个例子是:
清单7.基于更加复杂的表达式的片段
FRAGMENTBYEXPRESSION
(Age<50AND
(BirthdayBETWEEN'01/01/1998'AND'4/15/2008')
ORLNameIN("Smith","Zimmermann"))INdbs1,
(Age>51ORAge=17
ANDLNameNOTLIKE'%John%')INdbs2;
尽管表达式可以变得更加复杂(甚至比清单7中的表达式还要复杂),但经验表明最好使用比较简单的表达式,同时又要将数据很好地分布到各个片段中。
选择适当的片段模式能够显著改善性能。
要理解这一点,请阅读InformationCenter的Administering主题下的PerformanceGuide的“FragmentationGuidelines”部分。
分区表与片段表非常接近,唯有两个地方不同:
∙每个dbspace可以有一个或多个分区
∙CREATETABLE语法
分区表允许每个dbspace包含多个分区。
这样做的好处是,具有10个分区的表可以分布在10以内的dbspace中,而具有10个片段的表必须使用10个dbspace。
由于分区表允许每个dbspace上有多个分区,所以必须更改SQL语句的语法,因为不能再通过默认的dbspace名引用其中的分区。
清单8.分区表的语法
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate
)
PARTITIONBYEXPRESSION
PARTITIONpart1(Age>50)INdbs1
PARTITIONpart2(Age<51)indbs1;
清单8中的例子显示如何在同一个dbspace(dbs1)中创建两个分区,并给它们分配名称(part1和part2)。
片段或分区的名称的重要性在于它允许用户在未来操作片段或分区。
一个简单的例子是:
清单9.修改片段
ALTERFRAGMENTONTABLEcustomer
MODIFYdbs1TOAge<55INdbs1;
清单9中的例子修改了为从Age<50到Age<55的片段创建的表达式。
注意modify子句如何通过在MODIFY关键字之后指定dbspace名称dbs1,从而准确地引用将要修改的片段的表达式。
更改这个例子,转而使用以上的分区例子,结果类似于:
清单10.修改分区
ALTERFRAGMENTONTABLEcustomer
MODIFYPARTITIONpart1TOAge<55INdbs1;
注意清单10中的例子如何使用分区名part1指定需要修改的分区表达式。
临时表
临时表基本上与真实的表一样,但有一些小的例外:
1.当创建临时表的用户断开数据库连接时,将自动删除临时表
2.在所有类型的数据库中,可以不记录临时表的日志
3.临时表仅对创建它们的用户可见
可以通过以下两种方式之一创建临时表:
∙使用SELECT…INTOTEMP…SQL语句
∙使用CREATETEMPTABLE…SQL语句
在创建了临时表之后,就可以像数据库中的其他可见表一样使用它们。
清单11.创建临时表
CREATETEMPTABLEtemp_cust(Namechar(50),Oldint,Bdaydate);
SELECT*FROMcustomer,temp_tab
WHEREcustomer.Age=temp_cust.Old;
临时表不具备常规表的所有功能,但它们包含片段、索引和一些限制选项。
WITHNOLOG子句用于关闭临时表的日志:
清单12.关闭临时表的日志
CREATETEMPTABLEtemp_cust
(Namechar(50),Oldint,Bdaydate)WITHNOLOG;
限制
如果谈论表对象,必然会谈到限制。
事实上,RDBMS(RelationalDatabaseManagementSystem)的诞生源自一种类型的限制。
尽管限制类型是引用而非关系的,但是引用限制基于关系的构思之上。
在谈及限制时,我们通常谈到完整性(例如,引用限制通常称为引用完整性)。
事实上,限制帮助保持了数据的完整性。
根据Merriam-WebsterThesaurus词典,单词“完整(integrity)”和“损坏(corrupt)”是反义词,即它们的意思相反。
这同样适用于数据库,因为您最不希望数据被损坏(损坏的数据将无效)。
因此,我们设法使用不同类型的限制来保持数据的完整性。
一个重要例子是,对社会保险号(SocialSecurityNumber,SSN)列使用唯一性限制。
因为每位美国公民都应该有不同的SSN,因此您希望在该列设置限制,从而确保customer表中的每个行都有一个不同的、唯一的SSN值。
如果没有在数据库中使用限制,那么应用程序就必须维护唯一性,否则可能导致多个客户拥有相同的SSN。
如果拥有相同SSN的客户属于同一个人,那么还不至于导致数据损坏,但是您不能阻止向表中添加另一个使用该SSN的人,这就导致损坏的数据,或不一致的数据。
注意:
限制不一定存在数据库中;它还可以通过应用程序控制。
讨论在哪里设置限制不是三言两语就能说明白的,因此本教程不深入讨论。
但是您一定要使用一种限制,绝对不要同时忽略了这两种限制。
清单13中的例子在SSN中创建了一个唯一性限制,其名称为ssn_unq:
清单13.创建唯一性限制
CREATETABLEcustomer(
SSNchar(11)UNIQUECONSTRAINTssn_unq,
LNamechar(50),
Ageinteger,
Birthdaydate
);
注意:
IDS允许使用DISTINCT关键字代替UNIQUE。
IDS认为它们是同义词。
注意:
限制不一定要由DBA命名。
如果DBA不指定限制的名称,将自动为限制生成一个内部名称。
通过SQL语法给限制命名能够更容易识别限制违背错误,比如限制名出现错误。
表2描述了各种可用的限制类型:
表2.限制及其说明
限制
说明
UNIQUE或DISTINCT
限制每个列不出现两个相同的值
Primarykey
使用唯一限制,并允许在该列集上使用引用完整性
Foreignkey
在引用完整性中用于指向主键列的列
Check
列上的表达式,用于检查数据是否对该列有效
Notnull
要求每个行都包含针对该列的一个值
Default
当插入新行时,在没有为列指定值的情况下指定的默认值
引用限制
引用限制的存在依赖于其他限制的存在。
引用限制存在两组数据之间。
关系数据库中的数据的组在表中称为列。
因此,引用限制存在于一个或多个表的两个或多个列中。
在很多情况下,这种限制称为主/外键关系。
这是因为外键列引用主键列。
尽管这是非常常见的实践,但这不是规则。
引用限制可以存在两个列之间,不管这些列是否是键列(主键或外键)。
创建引用限制时需要遵循某些规则。
其中一些规则包括(不是完整的列表):
∙引用的列必须是唯一的,可以使用主键限制或唯一限制定义。
∙列必须使用同一数据类型或兼容的数据类型。
∙列必须位于同一数据库中。
清单14中的例子扩展了清单13,它添加了第二个表,该表包含针对第一个表的列的引用限制定义:
清单14.第二个表上的引用限制
CREATETABLEcustomer(
SSNchar(11)UNIQUECONSTRAINTssn_unq,
LNamechar(50),
Ageinteger,
Birthdaydate
);
CREATETABLEorders(
OrderNumberinteger,
OrderingCustomerchar(11)REFERENCEScustomer(SSN),
OrderTotalmoney
);
清单15提供的例子使用主键实现了相同的目标:
清单15.使用主键在第二个表上实现引用限制
CREATETABLEcustomer(
SSNchar(11)PRIMARYKEYCONSTRAINTssn_unq,
LNamechar(50),
Ageinteger,
Birthdaydate
);
CREATETABLEorders(
OrderNumberinteger,
OrderingCustomerchar(11)REFERENCEScustomer(SSN),
OrderTotalmoney
);
还可以创建一个要求多个列具有唯一性的表。
拿本例来说,那么就需要使用不同的语法定义唯一性或主键限制。
引用列也需要使用不同的语法。
注意:
如果要对主键使用多个列,那么必须在限制的引用方使用相同数量的列。
清单16.使用多个列
CREATETABLEstock(
StockNumberinteger,
ManufacturerCodechar(3),
Descriptionchar(50),
UNIQUE(StockNumber,ManufacturerCode)CONSTRAINTuq_stock
);
CREATETABLEcatalog(
CatalogNumberinteger,
StockNumberinteger,
ManufacturerCodechar(3),
FOREIGNKEY(StockNumber,ManufacturerCode)
REFERENCESstock(StockNumber,ManufacturerCode)
CONSTRAINTfk_catalog
);
清单16中的外键语法还将用于建立一个引用限制,即使您使用下面的语法来表示一个多列主键:
清单17.多列主键
CREATETABLEstock(
StockNumberinteger,
ManufacturerCodechar(3),
Descriptionchar(50),
PRIMARYKEY(StockNumber,ManufacturerCode)Constraintpk_stock
);
CHECK限制
CHECK限制是放置在一个列上的表达式,它为该列指定有效数据域。
当每次向列插入一个新值或更新列中的现有值时,将计算该表达式。
如果新值不满足表达式的条件,将向SQL语句返回一个错误。
不过,如果CHECK限制的计算结果返回一个NULL值,那么该值将被接收,并且不返回错误。
清单18提供一个CHECK限制的例子,其中一个人的Age的数据域范围是1-124:
清单18.Check限制
CREATETABLEcustomer(
SSNchar(11),
LNamechar(50),
Ageinteger,
Birthdaydate,
CHECK(0 ); 定义相同的CHECK限制时,还可能用到以下语法: CHECK(AgeBETWEEN1AND124) 在这个例子中,值必须为1和124,因为BETWEEN包含所指的值本身,如果使用0,那么Age0就是一个有效值。 在我的例子中,age=0不是有效值。 NOTNULL限制 NOTNULL限
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 部分IDS 表视图和索引 部分 IDS 视图 索引