暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

表概述

原创 2023-04-23
199

表是Oracle数据库中的数据组织的基本单位。表描述了一个实体,其相关重要信息必须被记录。例如,雇员可能是一个实体。
Oracle数据库表分为以下几个基本类别:
•关系表
关系表具有简单的列,是最常见的表类型。示例2-1显示了一个用于创建关系表的CREATETABLE语句。
•对象表
列对应于对象类型的顶层属性。请参见“对象表”。
您可以创建一个具有下列组织特征的关系表:
•堆组织表,它不会以任何特定顺序存储行。默认情况下,CREATETABLE语句创建堆组织表。
•索引组织表,它按主键值对行进行排序。对于某些应用程序,索引组织表可以增强性能并更有效地使用磁盘空间。请参见"索引组织表概述"。
•外部表,是一个只读表,它的元数据存储在数据库中,但其数据存储在数据库外。请参阅"外部表"。
表要么是永久的,要么是临时的。永久表的定义和数据保持跨会话存在。临时表的定义与永久表有相同的存在方式,但其数据仅在一个事务或会话的持续期间有效。临时表可用于暂存某些应用程序在运行过程中由多个操作所生成的中间结果集。
本部分包含下列主题:
•列和行
•示例:CREATETABLE和ALTERTABLE语句
•完整性约束
•对象表
•临时表
•外部表
•表存储

列和行

表的定义包括表名称和列集。列标识由表所描述的实体的一个属性。例如,在雇员表中的列employee_id,是指雇员实体中的雇员ID属性。
通常,当您将创建一个表时,给每列一个列名称、数据类型、和宽度。例如employee_id的数据类型是NUMBER(6),这表明此列只可以包含长达6位数的数字数据宽度。与DATE类型一样,宽度可以由数据类型预先确定。
表可以包含虚拟列,与非虚拟列不一样,虚拟列不占用磁盘空间。数据库通过计算一组用户指定的表达式或函数,按需派生出虚拟的列值。例如虚拟列income可能是salary列和commission_pct列的一个函数。
创建一个表后,可以使用SQL插入、查询、删除、和更新行。行是对应于表中某条记录的列信息的集合。例如,雇员表中的一行描述一个特定的雇员的属性。

示例:CREATETABLE和ALTERTABLE语句

用于创建表的OracleSQL命令是CREATETABLE。示例2-1显示了hr示例模式中用于创建雇员表的CREATETABLE语句。该语句指定了employee_id、first_name等列,并为每个列指定了数据类型,如NUMBER或DATE等。
示例2-1CREATETABLEemployees
image.png

示例2-2显示了ALTERTABLE语句,它向雇员表添加了一个完整性约束。完整性约束强制实施业务规则和防止向表中输入无效信息。
image.png
示例2-3显示了hr.employees表中的8行和6列。
示例2-3employees表中的行
image.png
示例2-3中的输出说明了表、行、和列的如下重要特性:
•表中的行描述一名雇员的全部属性:名称、薪金、部门等。例如,输出的第一行显示名为StevenKing的雇员记录。
•列描述该雇员的一个属性。在本例中,employee_id列是主键,其含义是指每一位员工由其雇员id唯一地标识,保证任何两个雇员都不具有相同的雇员id。
•非键列可以包含具有相同值的行。在本例中,雇员101、102的薪金相同,都是17000。
•外键列会引用同一个表或另一个表中的主键或唯一键。在本例中,department_id值90对应于departments表中的department_id列等于90的行。
•域是行和列的交叉点。它只可以包含一个值。例如,雇员104的部门ID域包含值60。
•域可以没有值。在这种情况下,该域包含空值。雇员100的commission_pct列的值为空,而雇员149的相应值是.2。一个列通常允许为空,除非已对该列定义了NOTNULL或主键完整性约束,在这种情况下如果该列无值,是不可以插入任何行的。

完整性约束

完整性约束是一种命名规则,用于限制一个或多个表中的列值。这些规则可以防止向表中输入无效数据。此外,约束也可以防止当存在某些依赖项时删除表中的数据。
如果启用了约束,则输入或更新数据时,数据库会检查数据。不符合该约束的数据会被阻止输入。如果禁用了约束,则不符合该约束的数据可以被允许输入数据库。
在示例2-1中,CREATETABLE语句对last_name、email、hire_date、和job_id列指定了非空约束。约束子句标识列和约束的条件。这些约束确保指定的列中不包含空值。例如,试图插入一个没有jobID的新雇员将产生一个错误。
您可以在创建表时或创建表后创建一个约束。如果需要,可以暂时禁用约束。数据库将约束存储在数据字典中。

对象表

Oracle对象类型是具有名称、属性、和方法的用户定义类型。对象类型使得对现实世界中的实体(如客户和采购单等),作为对象在数据库中进行建模成为可能。
对象类型定义逻辑结构,但不会创建存储。示例2-5创建了一个名为department_typ的对象类型。
image.png
对象表是一种特殊的表,其中每一行表示一个对象。在示例2-6中,CREATETABLE语句创建一个名为departments_obj_t的对象表,其对象类型为department_typ。此表的属性(列)派生自该对象类型的定义。使用INSERT语句将行插入到此表。
示例2-6对象表
image.png
与关系表列相似,对象表只能包含同种类型的行,即具有同种声明类型的对象实例。默认情况下,对象表中的每个行对象都有一个相关联的逻辑对象标识符(OID),以便在该对象表中唯一地标识该对象。对象表的OID列是一个隐藏列。

临时表

Oracle数据库的临时表,用于存放只存在于某个事务或会话期间的数据。临时表中的数据是会话私有的,这意味着每个会话只可以查看和修改自己的数据。
临时表对于必须缓冲中间结果集的应用程序非常有用。例如,一个计划应用程序使学生可以创建可选的学期课程计划。每个课程计划由临时表中的一行表示。在会话期间,课程计划数据是私有的。当某个学生确定了课程计划,应用程序会将其所选计划移入永久表。在会话结束时,临时表中的课程计划数据将被自动删除

创建临时表

使用CREATEGLOBALTEMPORARYTABLE语句创建一个临时表。ONCOMMIT子句指定表中的数据是特定于事务(默认值),还是特定于会话。
与其它一些关系数据库中的临时表不同,当你在Oracle数据库中创建一个临时表时,你只创建其静态表定义。临时表是在数据字典中所描述的一个持久对象,但在您的会话向表中插入数据之前,表显示为空。你是在为数据库本身创建一个临时表,而不是为每个PL/SQL存储过程。
因为临时表是静态定义的,您可以使用CREATEINDEX语句为其创建索引。临时表上创建的索引也是临时的。在索引中的数据与临时表中的数据具有相同的会话或事务范围。您还可以在临时表上创建一个视图或触发器。

临时表中的段分配

与永久表类似,临时表被定义在数据字典中。但是,临时表和他们的索引不会在创建时自动分配段。相反,临时段是在第一次插入数据时分配的。在一个会话中加载数据之前,表显示为空。对特定事务的临时表,临时段在事务结束时释放空间,而对特定于会话的临时表,在会话结束时释放空间。

外部表

外部表访问外部数据源中的数据,如同此数据是在数据库中的表中一样。您可以使用SQL、PL/SQL、和Java查询外部数据。
外部表可用于查询平面文件。例如,一个基于SQL的应用程序,可能需要访问一个文本文件中的记录。记录的形式如下:
image.png
您可以创建一个外部表,把这个文件复制到外部表定义中指定的位置,并使用SQL查询该文本文件中的记录。
外部表对于在数据仓库环境中执行常见的ETL任务也是很有价值的。例如,外部表使得数据加载阶段和数据转换阶段对接,消除了为进一步处理数据库中的数据而在数据库内存放中间数据的需要。

创建外部表

在数据库内部,创建一个外部表意味着在数据字典中创建元数据。与普通的表不同,外部表不描述存储在数据库中的数据,也不会描述数据在外部是如何存储的。外部表的元数据描述了外部表层必须如何提供数据给数据库。
CREATETABLE…ORGANIZATIONEXTERNAL语句包含两部分。
外部表定义描述列类型。这个定义像一个视图,使您可以使用SQL查询外部数据,而不用将其加载到数据库。该语句的第二部分将外部数据映射到列。
外部表是只读的,除非它是使用CREATETABLEASSELECT和ORACLE_DATAPUMP访问驱动程序创建的。外部表有些限制,包括不支持索引列、虚拟列、和列对象。

外部表访问驱动程序

访问驱动程序是一个API,它为数据库解释外部数据。访问驱动程序在数据库内运行,数据库使用该驱动程序来读取外部表中的数据。访问驱动程序和外部表层负责对数据文件中的数据进行转换,使它与外部表定义匹配。图2-4表示外部数据是如何被访问的。
image.png
Oracle为外部表提供了ORACLE_LOADER(缺省)和ORACLE_DATAPUMP访问驱动程序。对于这两个驱动程序来说,外部文件不是Oracle数据文件(,而只是普通操作系统文件)。
ORACLE_LOADER允许通过SQL*Loader对外部文件进行只读访问。您不能使用ORACLE_LOADER驱动程序创建、更新、或追加数据到外部文件。
ORACLE_DATAPUMP驱动程序使您能够卸载外部数据。此操作包括从数据库读取数据,并将其插入到由一个或多个外部文件所代表的外部表中。创建外部文件后,无法更新或将追加数据到外部文件。该驱动程序也使您能够加载外部数据,包括读取外部表并将其数据加载到数据库中。

表存储

Oracle数据库使用表空间中的数据段保存表数据。如"用户段"所述,段包含由数据块组成的扩展盘区。
表数据段(或涉及表簇时的簇数据段)位于表所有者的默认空间中,或CREATETABLE语句中所指定的表空间中。

表组织

默认情况下,表按堆的形式来组织数据,这意味着数据库将行存放在最适合他们的位置,而不是按用户指定的顺序来存放。因此,堆组织表是一个无序的行的集合。当用户往其中添加行时,数据库将行置于在数据段中第一个可用的空闲空间。不能保证行按照插入它们的顺序进行检索。
注意:
索引组织表使用不同的组织原则。
hr.departments表是一个堆组织表。它具有部门ID、名称、经理ID、位置id等列。当插入行时,数据库将其存储到适合的位置。表段中的某个数据块可能包含示例2-7所示的无序的行。
Example2-7RowsinDepartmentsTable
image.png
列的顺序对于表中的所有行都是相同的。通常,数据库按它们被列在CREATETABLE语句中的列顺序来存储列,但这个顺序是不保证的。例如,如果表中有LONG类型的列,那么数据库总是将其存储到行中的最后一列。此外,如果向表中添加一个新列,则新列将被存储为最后一列。
与常规列不同,表可以包含虚拟列,它不占用磁盘上的空间。数据库通过计算一组用户指定的表达式或函数,在虚拟列中按需派生一个值。您可以对虚拟列创建索引、收集统计数据、并创建完整性约束。因此,虚拟列非常像非虚拟列。

行存储

数据库将行存储在数据块中。在表中,少于256个列的行,被存储在一个或多个行片中。
数据库尽可能将每一行作为一个行片来存储。但是,如果所有的行数据不能插入到一个单一数据块中,或者对现有的行的更新导致行溢出,则数据库使用多个行片来存储此行。
表簇中的行除了包含非聚集表中的行相同的信息,还包含对其所属簇键的引用信息。

行片Rowids

rowid实际上是行的一个10字节的物理地址。如"Rowid数据类型"中所述,堆组织表中的每一行都有一个在该表中唯一的rowid,与一个行片的物理地址相对应。对于表簇,处于同一个数据块的不同表中的行可以有相同的rowid。
Oracle数据库在内部使用rowids来构建索引。例如,在B树索引中的每个键与一个指向关联行地址的rowid相关联,以便快速访问(请参阅"B树索引")。物理rowids提供对表行尽可能最快的访问,使数据库几乎只需单次I/O就可以检索到行。

表压缩

数据库可以使用表压缩来消除数据块中的重复值。对于数据高度冗余的表,压缩可以节省磁盘空间,减少数据库高速缓存中的内存使用,并在某些情况下可以加快查询执行速度。表压缩对数据库应用程序是透明的。

基本/OLTP表压缩

基于字典的表压缩提供了很好的压缩率。Oracle数据库支持以下类型的表压缩:

•基本表压缩

这种类型的压缩只能压缩由直接路径加载插入的数据,只支持有限的数据类型和SQL操作。

•OLTP表压缩

这种类型的压缩用于OLTP应用程序,并可压缩任何SQL操作的数据。
数据库以行主要格式存储压缩行。一个行的所有列都存储在一起,接下来是下一行的所有列,依次类推。重复值被替换为一个存储在块开始处的符号表短引用。因此,重新创建未压缩数据所需的信息存储在数据块本身中。
压缩的数据块看起来跟正常的数据块差不多。在常规数据块上能正常工作的大多数数据库功能,也可以在压缩的数据块上正常工作。

压缩声明

您可以在表空间、表、分区或子分区等级别声明压缩。如果在表空间级指定了压缩,则在该表空间中创建的所有表在缺省情况下都是压缩的。
下面的语句将OLTP压缩应用于orders表:
image.png

空值存储

空值是指在某个列中值的缺失。空值表示缺少、未知、或不适用的数据。
在数据库中,如果在空值的前后都有数据值,则空值会被存储。在这些情况下,他们需要1个字节来存储列的长度(零)。尾随的空值在行中不需要存储,因为新的行头标志着前一行中的剩余列都为空。例如,如果表的最后三列为空,则不为这些列存储数据。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论