OracleDatabase10g基础教程(第二版)第10章管理表第1页第10章管理表本章概述本章要点教学过程OracleDatabase10g基础教程(第二版)第10章管理表第2页本章概述在Oracle系统中,从某种程度上来讲,表是数据库中最重要、最基本的对象,是实际存储数据的地方。对数据库的许多管理和操纵,实际上就是对数据库中表的管理和操纵。完整性约束是提高数据质量的最重要和最常用的手段。索引是加快对表中数据检索的方式,也是一种重要的数据库对象。本章将要对OracleDatabase10g系统中的表的类型、创建和管理进行全面的介绍。OracleDatabase10g基础教程(第二版)第10章管理表第3页本章要点理解表的基本概念了解表的类型和基本特征理解数据类型的特点掌握创建表技术掌握修改表技术掌握删除表技术理解truncatetable的特点OracleDatabase10g基础教程(第二版)第10章管理表第4页教学过程10.1概述10.2SQL数据类型10.3创建表和约束10.4表类型10.5表的特性10.6修改表10.7删除表10.8truncatetable10.9数据字典OracleDatabase10g基础教程(第二版)第10章管理表第5页教学过程10.1概述10.2SQL数据类型10.3创建表和约束10.4表类型10.5表的特性10.6修改表10.7删除表10.8truncatetable10.9数据字典OracleDatabase10g基础教程(第二版)第10章管理表第6页10.1概述在Oracle系统中,表是数据库中的主要对象,是真正存储信息的对象。一般而言,表具有以下特征:–代表实体–表名在数据库中是唯一的–由行和列组成–行的顺序是任意的–列的顺序是任意的–列名在表中是唯一的OracleDatabase10g基础教程(第二版)第10章管理表第7页表属性的特点对于所有类型的表,Oracle都允许开发人员和管理员规定各种表属性,他们会确定如下内容:–哪一个表空间包含表;–Oracle怎样将表物理存储在磁盘上;–当从磁盘读取表数据时,Oracle怎样将它们与内存进行映射;–Oracle怎样控制表上特定操作的日志。OracleDatabase10g基础教程(第二版)第10章管理表第8页教学过程10.1概述10.2SQL数据类型10.3创建表和约束10.4表类型10.5表的特性10.6修改表10.7删除表10.8truncatetable10.9数据字典OracleDatabase10g基础教程(第二版)第10章管理表第9页10.2SQL数据类型创建表的第一件事情是,学习Oracle中可以使用的SQL基本数据类型。前面已经提到过,SQL数据类型与PL/SQL数据类型有相同的地方,也有不同的地方。SQL数据类型有时也被称为数据库数据类型。下面分别介绍SQL的数值类型、字符类型和日期类型。OracleDatabase10g基础教程(第二版)第10章管理表第10页数值类型数值类型可以用于存储整数、浮点数以及实数。在Oracle系统中,number数据类型具有精度(precision)和范围(scale)。精度是数值中的数字总和,可以是1~38个数字之间的任何值。范围取值可以是0~3,表示任何给定数值的小数点右边的位数。在创建表时,可以使用如下的语法格式声明number列:–column_namenumber(precision[,scale])OracleDatabase10g基础教程(第二版)第10章管理表第11页字符类型字符数据类型可以用于声明包含了字母、数字数据的列,包括char、nchar、varchar2、nvarchar2、raw、long和longraw、大对象等。OracleDatabase10g基础教程(第二版)第10章管理表第12页日期和时间与1993年5月18日或2005年1月1日这样的时间点相关联的数据类型称为日期时间类型,类似于2个小时或1个月这样的时间段通常称为间隔。Oracle系统与PL/SQL类似,可以使用以下数据类型创建表:–date–timestamp–timestampwithtimezone–timestampwithlocaltimezone–intervalyeartomonth–intervaldaytosecondOracleDatabase10g基础教程(第二版)第10章管理表第13页ANSI数据类型Oracle系统支持工业标准的ANSISQL数据类型。当在Oracle系统中使用ANSISQL数据类型创建列时,系统会自动将这些数据类型隐式地转换成合适的Oracle内置数据类型。如表10-4和表10-5所示分别列出了数值数据类型转换表和字符数据类型转换表。OracleDatabase10g基础教程(第二版)第10章管理表第14页教学过程10.1概述10.2SQL数据类型10.3创建表和约束10.4表类型10.5表的特性10.6修改表10.7删除表10.8truncatetable10.9数据字典OracleDatabase10g基础教程(第二版)第10章管理表第15页10.3创建表和约束为了在数据库中存储和管理数据,理解怎样创建和维护表是非常重要的。在Oracle系统中,可以使用createtable语句创建表。本节介绍创建表和表中约束的基本技术,为理解表的类型和特性奠定基础。OracleDatabase10g基础教程(第二版)第10章管理表第16页基本语法创建表的最简单、最常见的方法的语法格式如下:–createtable[schema_name.]table_name(–column_namedatatype[defaultexpression][constraint]–[,column_namedatatype[defaultexpression][constraint]]–[,…]–);OracleDatabase10g基础教程(第二版)第10章管理表第17页约束在Oracle系统中,可以使用声明型完整性约束和参照完整性约束来确保表中数据的正确。下面详细介绍定义约束的基本语法以及主键约束、外键约束、唯一性约束、检查约束等的作用和特点。OracleDatabase10g基础教程(第二版)第10章管理表第18页定义约束的基本语法约束既可以在createtable语句中创建,也可以在altertable语句中添加。在这两种定义方式中,定义约束的语法是类似的。下面主要介绍使用altertable语句定义约束的基本语法格式:–altertable[schema.]table_name–add[constraint[name]]constraintdefinition–);OracleDatabase10g基础教程(第二版)第10章管理表第19页主键约束表的主键可以确保在一个表中没有重复行。尽管用户可以创建没有主键的表,但是应该尽量避免这样做。在表的所有行中,用作主键的列或列的集合必须是唯一的,且不能为null。在Oracle系统中,主键可以由一个表的一个列或若干个列构成。但是,主键最多只能由32个列构成。定义主键约束的基本语法格式如下:–altertabletable_name–addconstraintprimary_key_nameprimarykey–primarykey(table_column);OracleDatabase10g基础教程(第二版)第10章管理表第20页外键约束在Oracle系统中,表能够通过使用所谓的外键约束进行关联。外键约束可以放在一个表(子表)中的一个列或一组列上。作为外键约束定义的组成部分,必须要定义子表的列去参照另一个表(父表)中的一个匹配列或组列。如果插入子表的行在外键列中具有非null值,那么在父表行中必须在所引用的列中有相同的值。如果在父表中没有相应的值,那么这种插入操作将会失败。通过定义外键约束,可以在表与表之间建立父子关系。这是数据库中参照完整性的基础。定义外键约束的语法格式如下:–altertablechild_table–addconstraintforeign_key_name–foreignkey(child_table_column)referencesparent_table(parent_table_column);OracleDatabase10g基础教程(第二版)第10章管理表第21页唯一性约束唯一性约束可以确保表中的各行,对于值为非null的给定列或列组都具有唯一值。在使用唯一性约束时,应该遵循下面的原则:–在表中,可以有多个行在相应的唯一性约束列中具有null值。–可以使用多个列建立唯一性约束。–唯一键最多有32个列组成;–当定义唯一键约束时,Oracle会在后台建立一个唯一性索引来强制唯一性。定义唯一性约束的语法格式如下:–altertabletable_name–addconstraintunique_key_name–unique(column_name);OracleDatabase10g基础教程(第二版)第10章管理表第22页检查约束检查约束就是指定表中某个列的取值范围。对于即将插入表中的数据来说,如果插入的数据满足检查约束指定的条件,则插入操作成功。否则,插入操作失败。在如图10-10所示的示例中,首先创建了一个students表,该表由student_id、student_name和gender共3个列组成。然后,在该表上增加了一个检查约束,用于限制gender列只能取值female或male。OracleDatabase10g基础教程(第二版)第10章管理表第23页createtableasselect如果希望复制一个表的结构,但是不复制表中的数据,也可以使用createtabletable_nameasselect语句。不同的是,应该在where子句中使用一个不能成立的条件。在如图10-12所示的示例中,基于emp表,复制创建了emp_copy表。由于在复制过程中使用了条件“1=2”,因此复制的表只是具备了结构,但是没有数据。OracleDatabase10g基础教程(第二版)第10章管理表第24页教学过程10.1概述10.2SQL数据类型10.3创建表和约束10.4表类型10.5表的特性10.6修改表10.7删除表10.8truncatetable10.9数据字典OracleDatabase10g基础教程(第二版)第10章管理表第25页10.4表类型在Oracle系统中经常使用到的表包括堆表、外部表、索引组织表、临时表、分区表、簇表、散列簇表等类型。下面分别介绍这些表的作用和特点。OracleDatabase10g基础教程(第二版)第10章管理表第26页堆表堆的含义是乱七八糟。在Oracle系统中,最基本的表类型是堆表。这里堆的含义是:数据是在磁盘上随机存储的。一般情况下,Oracle系统在将数据行写入数据块时不会考虑其它行的存储位置。当向堆表中插入数据时,数据库会将该数据写入第一个有足够自由空间的段中。当修改和删除数据行时,系统将为新的插入提供可用的空间。下面通过一个示例系统将如何创建和使用堆表。如图10-13所示的示例,创建了一个subjects表。OracleDatabase10g基础教程(第二版)第10章管理表第27页外部表外部表是从Oracle9i开始增加的表。外部表是指在Oracle数据库之外的文件系统中存储的只读表。在Oracle9i以前,使用操作系统上的普通文件存储数据的唯一方式就是通过SQL*Loader工具将其加载入数据库,或者使用insert语句把普通文件中的数据直接插入到数据库的表中,手工建立堆表。但是,这种加载方式的问题是,如果源数据改变了,那么加载过来的数据也必须手工维护,否则这些加载的数据就没有意