Oracle数据库表基本概述
Oracle数据库表基本概述
表是 Oracle 数据库中的数据组织的基本单位。
按列定义方式划分:
关系表:关系表具有简单的列,是最常见的表类型。
对象表:列对应于对象类型的顶层属性。 。
按组织特征划分:
堆组织表:表中的数据不会以任何特定顺序存储,随机存储,是Oracle数据库最常用的表组织类型。 默认情况下,CREATE TABLE语句创建堆组织表。
索引组织表:它按主键值对行进行排序。 对于某些应用程序,索引组织表可以增强性能并更有效地使用的磁盘空间。
外部表:是一个只读表,它的元数据存储在数据库中,但其数据存储在数据库外。
簇表:表簇是一组表,它们共享公共的列,并将相关的数据存储在相同的数据块中,分为索引簇表和哈希簇表两种。
备注:索引组织表和簇表在后续文章单独介绍。
按数据保存周期划分(表要么是永久的,要么是临时的):
永久表:表中的数据保持跨会话存在。(可以永久保存在数据库中,事务结束、连接结束、数据库重启,数据都保持不变)。
临时表:表中的数据仅在一个事务或会话的持续期间有效。(事务结束或者会话结束,数据跟随清空)。
关系表
是Oracle数据库中最常见的表类型,一般我们业务95%以上,都是使用简单的关系表来存储业务数据。
列和行
表的定义包括表名称和列集。 列标识由表所描述的实体的一个属性。
创建一个表时,给每列一个列名称、 数据类型、和宽度。
表可以包含虚拟的列,与非虚拟列不一样,虚拟列不占用磁盘空间。 数据库通过计算一组用户指定的表达式或函数,按需派生出虚拟的列值。 例如虚拟列 income 可能是 salary 列和 commission_pct 列的一个函数。
简单关系表示例:
CREATE TABLE employees
( employee_id NUMBER(6)
, first_name VARCHAR2(20)
, last_name VARCHAR2(25)
CONSTRAINT emp_last_name_nn NOT NULL
, email VARCHAR2(25)
CONSTRAINT emp_email_nn NOT NULL
, phone_number VARCHAR2(20)
, hire_date DATE
CONSTRAINT emp_hire_date_nn NOT NULL
, job_id VARCHAR2(10)
CONSTRAINT emp_job_nn NOT NULL
, salary NUMBER(8,2)
, commission_pct NUMBER(2,2)
, manager_id NUMBER(6)
, department_id NUMBER(4)
, CONSTRAINT emp_salary_min
CHECK (salary > 0)
, CONSTRAINT emp_email_uk
UNIQUE (email)
) ;
对象表
Oracle 对象类型是具有名称、 属性、和方法的用户定义类型。
对象类型使得对现实世界中的实体(如客户和采购单等),作为对象在数据库中进行建模成为可能。
对象类型定义逻辑结构,但不会创建存储。
对象表是一种特殊的表,其中每一行表示一个对象。
与关系表列相似,对象表只能包含同种类型的行,即具有同种声明类型的对象实例。
默认情况下,对象表中的每个行对象都有一个相关联的逻辑对象标识符 (OID),以便在该对象表中唯一地标识该对象。对象表的 OID 列是一个隐藏列。
示例:
CREATE TYPE department_typ AS OBJECT
( d_name VARCHAR2(100),
d_address VARCHAR2(200) );
CREATE TABLE 语句创建一个名为 departments_obj_t 的对象表,其对象类型为 department_typ 。此表的属性 (列) 派生自该对象类型的定义。使用INSERT 语句将行插入到此表
CREATE TABLE departments_obj_t OF department_typ;
INSERT INTO departments_obj_t VALUES ('hr', '10 Main St, Sometown, CA');
堆组织表
默认情况下,表按堆的形式来组织数据,也是Oracle数据库中最常用的组织形式。
数据库将行存放在最适合他们的位置,而不是按用户指定的顺序来存放。
堆组织表是一个无序的行的集合。
当用户往其中添加行时,数据库将行置于在数据段中第一个可用的空闲空间。不能保证行按照插入它们的顺序进行检索。
对象表的创建示例,默认创建的就是堆组织表类型。
外部表
外部表的数据,存储在操作系统的文件中,而不是存储在数据库的数据文件中,因此成为“外部表”。
外部表是只读的,因为数据存储在操作系统文件中,数据库无法对数据进行任何增删改,只能查询。
在数据库内部,创建一个外部表意味着在数据字典中创建元数据。
外部表的元数据描述了外部表层必须如何提供数据给数据库。
外部表有些限制,包括不支持索引列、 虚拟列、和列对象。
外部表访问外部数据源中的数据,如同此数据是在数据库中的表中一样。可以使用 SQL 、 PL/SQL、和 Java 查询外部数据。
创建外部表
CREATE TABLE ... ORGANIZATION EXTERNAL 语句包含两部分。外部表定义描述列类型。
这个定义像一个视图,可以使用 SQL 查询外部数据,而不用将其加载到数据库。
语句的第二部分将外部数据映射到列。
外部表访问驱动程序
访问驱动程序是一个 API,它为数据库解释外部数据。访问驱动程序在数据库内运行,数据库使用该驱动程序来读取外部表中的数据。
访问驱动程序和外部表层负责对数据文件中的数据进行转换,使它与外部表定义匹配
Oracle 为外部表提供了 ORACLE_LOADER(缺省) 和ORACLE_DATAPUMP 访问驱动程序。对于这两个驱动程序来说,外部文件不是 Oracle 数据文件(而只是普通操作系统文件)。
ORACLE_LOADER驱动程序
允许通过 SQL*Loader 对外部文件进行只读访问。
不能使用 ORACLE_LOADER 驱动程序创建、 更新、或追加数据到外部文件。
ORACLE_DATAPUMP 驱动程序
能够卸载外部数据。
包括从数据库读取数据,并将其插入到由一个或多个外部文件所代表的外部表中。
创建外部文件后,无法更新或将追加数据到外部文件。
驱动程序能够加载外部数据,包括读取外部表并将其数据加载到数据库中。
外部数据是如何被访问的架构图:

永久表
表中的数据,可以永久保存在数据库中,事务结束、连接结束、数据库重启,数据都保持不变,而不会被清除。
对象表的创建示例,默认创建的就是堆组织表类型。
临时表
Oracle 数据库的临时表,用于存放只存在于某个事务或会话期间的数据。
临时表中的数据是会话私有的,这意味着每个会话只可以查看和修改自己的数据。
创建临时表
使用 CREATE GLOBAL TEMPORARY TABLE 语句创建一个临时表。
ON COMMIT 子句指定表中的数据是特定于事务 (默认值),还是特定于会话。
与其它一些关系数据库中的临时表不同,当你在 Oracle 数据库中创建一个临时表时,你只创建其静态表定义。临时表是在数据字典中所描述的一个持久对象,但在会话向表中插入数据之前,表显示为空。你是在为数据库本身创建一个临时表,而不是为每个 PL/SQL 存储过程。
因为临时表是静态定义的,可以使用 CREATE INDEX 语句为其创建索引。临时表上创建的索引也是临时的。在索引中的数据与临时表中的数据具有相同的会话或事务范围。还可以在临时表上创建一个视图或触发器
临时表中的段分配
与永久表类似,临时表被定义在数据字典中。但是,临时表和他们的索引不会在创建时自动分配段。相反,临时段是在第一次插入数据时分配的。在一个会话中加载数据之前,表显示为空。对特定事务的临时表,临时段在事务结束时释放空间,而对特定于会话的临时表,在会话结束时释放空间。
临时表示例
(1) 事务级临时表: on commit delete rows; commit 时 '删除' 记录(默认)
(2) 会话级临时表: on commit preserve rows; commit 时 '保存' 记录,结束会话时 '删除' 记录
事务级临时表
create global temporary table transaction_temp (
tid number(3),
tname varchar2(30)
) on commit delete rows;
其中:on commit delete rows 可省略,是默认选项
会话级临时表
create global temporary table session_temp (
tid number(3),
tname varchar2(30)
) on commit preserve rows;
浙公网安备 33010602011771号