Oracle 数据库基础教程2007
第 10章 模式对象
Oracle 数据库基础教程2007
本章内容
模式概念
表管理
索引管理
索引化表管理
分区表与分区索引的管理
簇、视图、序列、同义词、数据库链接管理
Oracle 数据库基础教程2007
本章要求
掌握表的管理
掌握索引的管理
掌握索引化表的概念及其管理
掌握分区的概念及分区管理
了解簇、视图、序列、同义词、数据库链接等的管理
Oracle 数据库基础教程2007
10.1模式
模式概念
模式与用户的关系
模式选择与切换
Oracle 数据库基础教程2007
模式概念
是指一系列逻辑数据结构或对象的集合。
模式与用户的关系
模式与用户相对应,一个模式只能被一个数据库用户所拥有,并且模式的名称与这个用户的名称相同。
通常情况下,用户所创建数据库对象都保存在与自己同名的模式中。
同一模式中数据库对象的名称必须惟一,而在不同模式中的数据库对象可以同名。
默认情况下,用户引用的对象是与自己同名模式中的对象,如果要引用其他模式中的对象,需要在该对象名之前指明对象所属模式。
Oracle 数据库基础教程2007
模式选择与切换
如果用户以 NORMAL身份登录,则进入同名模式;
若以 SYSDBA身份登录,则进入 SYS模式;
如果以 SYSOPER身份登录,则进入 PUBLIC模式。
Oracle 数据库基础教程2007
10.2表
Oracle常用数据类型
表的创建
表中约束的管理
表参数设置
表的修改
表的删除
利用 OEM管理表
Oracle 数据库基础教程2007
CREATE TABLE table_name
(column_name datatype
[column_level_constraint]
[,column_name datatype
[column_level_constraint]… ]
[,table_level_constraint])
[parameter_list]
直接创建表
Oracle 数据库基础教程2007
CREATE TABLE employee(
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15),
deptno NUMBER(3) NOT NULL CONSTRAINT
fk_emp REFERENCES dept
)
TABLESPACE USERS
PCTFREE 10 PCTUSED 40
STORAGE(INITIAL 50K NEXT 50K
MAXEXTENTS 10 PCTINCREASE 25);
Oracle 数据库基础教程2007
表名 ( table_name)
必须是合法标识符,长度为 1~ 30 字节,并且以字母开头,可以包含字母 (A~ Z,a~ z)、数字( 0~ 9),
下划线( _)、美元符号( $)和井号( #)。此外,
表名称不能是 Oracle数据库的保留字
数据类型 (datatype)
字符类型
数字类型
日期类型
大对象类型
其他类型
Oracle 数据库基础教程2007
CHAR( n)
定长字符串,n的取值范围为 1-2000字节
VARCHAR2( n)
可变字符串,n取值范围为 1-4000字节
自动调整数据长度
NCHAR(n)
用来存储 Unicode类型字符串。
NVARCHAR2(n)
它用来存储 Unicode类型字符串。
LONG
可变长字符列,最大长度为 2GB
用于不需设置成索引的字符,不常用字符类型
Oracle 数据库基础教程2007
数字数据类型
NUMBER( m,n)
可变长的数值列,m是所有有效数字的位数,n
为小数点后的位数
Oracle 数据库基础教程2007
日期数据类型
DATE
公元前 4712年 1月 1日到公元 4712年 1月 1日
默认格式,DD-MON-YY
习惯格式,YYYY-MM-DD HH,MM,SS
Oracle 数据库基础教程2007
大对象数据类型
BLOB,CLOB,NCLOB
用来保存较大的图形文件或带格式的文本文件、音频和视频等非文本文件
最大长度 4GB
BFILE
在数据库外部保存的大型二进制对象文件。
不能写,只能读、查询
大小有操作系统决定
Oracle 数据库基础教程2007
其他数据类型
RAW( n)
可变长二进制数据
保存较小的图形文件或带格式的文本文件
N取 1-2000字节
LONG RAW
可变长二进制数据
保存较大的图形文件或带格式的文本文件
N取 2GB字节
ROWID
UROWID
Oracle 数据库基础教程2007
约束( constraint)
在 Oracle数据库中对列的约束包括主键约束、惟一性约束、检查约束、外键约束和空 /非空约束等 5中,定义方法有表级约束和列级约束 2种。关于表的约束详见
10.2.2表约束中介绍。
参数( parameter_list)
在定义表时,可以通过参数设置表存储在哪一个表空间中,和存储空间分配等。
Oracle 数据库基础教程2007
利用子查询创建表
语法
CREATE TABLE table_name
(column_name [column_level_constraint]
[,column_name [column_level_constraint]… ]
[,table_level_constraint])
[parameter_list]
AS subquery;
Oracle 数据库基础教程2007
注意
通过该方法创建表时,可以修改表中列的名称,
但是不能修改列的数据类型和长度;
源表中的约束条件和列的缺省值都不会复制到新表中;
子查询中不能包含 LOB类型和 LONG类型列;
当子查询条件为真时,新表中包含查询到的数据;当查询条件为假时,则创建一个空表。
Oracle 数据库基础教程2007
创建一个表,保存工资高于 3000的员工的员工号、
员工名和部门号。语句为:
CREATE TABLE emp_select(
emp_no,emp_name,dept_no
)
AS
SELECT empno,ename,deptno FROM
employee WHERE sal>3000;
Oracle 数据库基础教程2007
CREATE TABLE EMP_SELECT ( EMPNO,ENAME,JOB,DEPTNO,
SALARY)
PCTFREE 10
PCTUSED 40
TABLESPACE users
STORAGE (INITIAL 50K NEXT 50K MAXEXTENTS 10
PCTINCREASE 25)
AS
SELECT EMPNO,ENAME,JOB,EDPTNO,SAL FROM
EMPLOYEES WHERE SAL>1000
Oracle 数据库基础教程2007
创建临时表
临时表中的数据在特定条件下自动释放,但其结构将一直存在。
临时表中的数据只在当前会话或当前事务中是有效的。
根据临时表中数据被释放的时间不同,临时表分为事务级别的临时表和会话级别的临时表两类。
ON COMMIT DELETE ROWS //事务级临时表
ON COMMIT PRESERVE ROWS //会话级临时表
Oracle 数据库基础教程2007
事务级别的临时表是在事务提交时系统自动删除表中所有记录。
CREATE GLOBAL TEMPORARY TABLE
tran_temp(
ID NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
)
ON COMMIT DELETE ROWS;
Oracle 数据库基础教程2007
会话级别的临时表是在会话终止时系统自动删除表中所有记录 。
CREATE GLOBAL TEMPORARY TABLE
sess_temp(
ID NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
)
ON COMMIT PRESERVE ROWS;
Oracle 数据库基础教程2007
10.2.2表约束
约束的类别
定义约束
添加和删除约束
设置约束状态
约束的延迟检查
查询约束信息
Oracle 数据库基础教程2007
约束的类别
约束作用
是在表中定义的用于维护数据库完整性的一些规则。
通过对表中列定义约束,可以防止在执行 DML操作时,
将不符合要求的数据插入到表中。
约束类型
PRIMARY KEY
UNIQUE
CHECK
FOREIGN KEY
NULL/NOT NULL
Oracle 数据库基础教程2007
PRIMARY KEY
特点
定义主键,起惟一标识作用,其值不能为
NULL,也不能重复;
一个表中只能定义一个主键约束;
建立主键约束的同时,在该列上建立一个惟一性索引,可以为它指定存储位置和存储参数;
主键约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
UNIQUE
特点
定义为惟一性约束的某一列或多个列的组合的取值必须惟一;
如果某一列或多个列仅定义惟一性约束,而没有定义非空约束,则该约束列可以包含多个空值;
Oracle自动在惟一性约束列上建立一个惟一性索引,可以为它指定存储位置和存储参数;
惟一性约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
在一个基本表中只能定义一个 PRIMARY KEY约束,
但可定义多个 UNIQUE约束;
对于指定为 PRIMARY KEY的一个列或多个列的组合,
其中任何一个列都不能出现空值,而对于 UNIQUE所约束的唯一键,则允许为空。
不能为同一个列或一组列既定义 UNIQUE约束,又定义 PRIMARY KEY约束。
PRIMARY KEY与 UNIQUE比较
Oracle 数据库基础教程2007
CHECK
特点
检查约束用来限制列值所允许的取值范围,其表达式中必须引用相应列,并且表达式的计算结果必须是一个布尔值;
约束表达式中不能包含子查询,也不能包含
SYSDATE,USER等 SQL函数,和 ROWID、
ROWNUM等伪列;
一个列可以定义多个检查约束;
检查约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
概念
FOREIGN KEY约束指定某一个列或一组列作为外部键,其中,包含外部键的表称为从表,包含外部键所引用的主键或唯一键的表称主表。
系统保证从表在外部键上的取值要么是主表中某一个主键值或唯一键值,要么取空值。
以此保证两个表之间的连接,确保了实体的参照完整性。
FOREIGN KEY
Oracle 数据库基础教程2007
FOREIGN KEY
特点
定义外键约束的列的取值要么是主表参照列的值,要么为空;
外键列只能参照于主表中的主键约束列或惟一性约束列;
可以在一列或多列组合上定义外键约束;
外键约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
NULL/NOT NULL
特点
在同一个表中可以定义多个 NOT NULL约束;
只能是列级约束。
Oracle 数据库基础教程2007
定义约束
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,
不必指定列名 ;
表约束与列定义相互独立,不包括在列定义中。
通常用于对多个列一起进行约束,与列定义用 ’,’
分隔。定义表约束时必须指出要约束的那些列的名称。
Oracle 数据库基础教程2007
定义列级约束的语法为:
[CONSTRAINT constraint_name]
constraint_type [conditioin];
定义表级约束的语法为:
[CONSTRAINT constraint_name]
constraint_type([column1_name,
column2_name,… ]|[condition]);
注意
Oracle约束通过名称进行标识。在定义时可以通过
CONSTRAINT关键字为约束命名。如果用户没有为约束命名,Oracle将自动为约束命名。
Oracle 数据库基础教程2007
CREATE TABLE student(
sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,
sname VARCHAR2(10) NOT NULL,
sex CHAR(2) CONSTRAINT S_CK1 check(sex in('M','F')),
sage NUMBER(6,2),
CONSTRAINT S_CK2 CHECK(sage between 18 and 60)
);
CREATE TABLE course(
cno NUMBER(6) PRIMARY KEY,
cname CHAR(20) UNIQUE
USING INDEX TABLESPACE indx STORAGE(INITIAL 64K
NEXT 64K)
);
Oracle 数据库基础教程2007
定义列级 FOREIGN KEY约束
[CONSTRAINT constraint_name]
[FOREIGN KEY]
REFERENCES ref_table_name (column_name,… )
定义表级 FOREIGN KEY约束
[CONSTRAINT constraint_name]
FOREIGN KEY (column_name,… )
REFERENCES ref_table_name (column_name,… )
[ON DELETE CASCADE|SET NULL];
Oracle 数据库基础教程2007
ON DELETE CASCADE
删除子表中所有相关记录
ON DELETE SET NULL
将子表中相关记录的外键约束列值设置为 NULL
ON DELETE RESTRICTED
受限删除,即如果子表中有相关子记录存在,则不能删除主表中的父记录,默认引用方式。
Oracle 数据库基础教程2007
DEFAULT
如果用户在插入新行时没有显示为列提供数据,系统将默认值赋给该列。
语法
[CONSTRAINT <约束名 > ] DEFAULT 表达式
Oracle 数据库基础教程2007
添加约束
添加约束语法为:
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name]
constraint_type(column1_name,column2_
name,… )[condition];
Oracle 数据库基础教程2007
创建一个表
CREATE TABLE player(
ID NUMBER(6),
sno NUMBER(6),
sname VARCHAR2(10),
sage NUMBER(6,2),
resume VARCHAR2(1000)
);
添加主键约束
ALTER TABLE player ADD CONSTRAINT P_PK
PRIMARY KEY(ID);
添加惟一性约束
ALTER TABLE player ADD CONSTRAINT P_UK
UNIQUE(sname);
Oracle 数据库基础教程2007
添加检查约束
ALTER TABLE player ADD CONSTRAINT P_CK
CHECK(sage BETWEEN 20 AND 30);
添加外键约束
ALTER TABLE player
ADD CONSTRAINT P_FK FOREIGN
KEY(sno)REFERENCES student(sno) ON DELETE
CASCADE;
添加空 /非空约束
注意,为表列添加空 /非空约束时必须使用 MODIFY子句代替
ADD子句。
ALTER TABLE player MODIFY resume NOT NULL;
ALTER TABLE player MODIFY resume NULL;
Oracle 数据库基础教程2007
修改约束
ALTER TABLE <table_name>
ADD <constraint>
MODIFY <constraint >
ENABLE <constraint >
DISABLE <constraint >
DROP <constraint >
Oracle 数据库基础教程2007
删除约束
删除指定内容的约束
ALTER TABLE player DROP UNIQUE(sname);
删除指定名称的约束
ALTER TABLE player DROP CONSTRAINT P_CK;
如果要在删除主键约束、惟一性约束同时保留惟一性索引,
则必须在 ALTER TABLE… DORP 语句中指定 KEEP
INDEX 子句。
ALTER TABLE player DROP CONSTRAINT P_UK
KEEP INDEX;
如果要删除约束同时,删除引用该约束的其他约束,则需要在 ALTER TABLE… DORP语句中指定 CASCADE关键字。
ALTER TABLE player DROP CONSTRAINT P_PK
CASCADE;
Oracle 数据库基础教程2007
设置约束状态
激活( ENABLE)状态
当约束处于激活状态时,约束将对表的插入或更新操作进行检查,与约束规则冲突的操作被回退。
禁用( DISABLE)状态
当约束处于禁用状态时,约束不起作用,与约束规则冲突的插入或更新操作也能够成功执行。
利用 SQL*Loader从外部数据源提取大量数据到数据库中;
进行数据库中数据的大量导入、导出操作;
针对表执行一项包含大量数据操作的批处理工作时。
Oracle 数据库基础教程2007
禁用约束
在定义约束时,可以将约束设置为禁用状态,默认为激活状态。也可以在约束创建后,修改约束状态为禁用。
创建表时禁用约束
CREATE TABLE S (SNO CHAR(10) PRIMARY KEY
DISALBE,… );
利用 ALTER TABLE… DISABLE禁用约束
ALTER TABLE STUDENT DISABLE CONSTRAINT
S_CK1;
ALTER TABLE STUDENT DISABLE UNIQUE (sname);
Oracle 数据库基础教程2007
禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引。若在禁用约束时,
保留对应的惟一性索引,可使用 ALTER
TABLE… DISABLE… KEEP INDEX语句。
ALTER TABLE STUDENT DISABLE UNIQUE (sname) KEEP
INDEX;
ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP
INDEX;
若当前约束 (主键约束、惟一性约束 )列被引用,则需要使用
ALTER TABLE… DISABLE… CASCADE语句同时禁用引用该约束的约束。
ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP
INDEX CASCADE;
Oracle 数据库基础教程2007
激活约束
创建或添加约束时,默认为激活状态。
利用 ALTER TABLE… ENABLE… 语句激活约束
ALTER TABLE STUDENT ENABLE UNIQUE (sname);
禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引,可以为索引设置存储位置和存储参数 (索引与表尽量分开存储 )。
ALTER TABLE STUDENT ENABLE PRIMARY KEY
USING INDEX TABLESPACE indx STORAGE(INITIAL 32K
NEXT 16K);
通过 ALTER TABLE… MODIFY… DISABLE|ENABLE语句改变约束状态
ALTER TABLE STUDENT MODIFY CONSTRAINT S_CK2
DISABLE;
Oracle 数据库基础教程2007
约束的延迟检查
默认情况下,在表中的约束都是不可延迟约束,Oracle在一条 DML语句执行完毕之后立即进行约束检查(除非禁用)。
创建约束时可以显式使用 DEFERRABLE关键字,创建可延迟的约束。
INITIALLY IMMEDIATE 或 INITIALLY DEFERRED说明可延迟约束在初始状态下是立即检查还是延迟检查
如果在定义约束时设定为不可延迟,则约束创建后不能更改其可延迟性。只有创建时设定为可延迟的约束,创建后才能更改其可延迟性。
Oracle 数据库基础教程2007
创建两个表,其约束都是可延迟的。
CREATE TABLE new_dept(
deptno NUMBER PRIMARY KEY DEFERRABLE
INITIALLY IMMEDIATE,
dname CHAR(10) UNIQUE
);
CREATE TABLE new_emp(
empno NUMBER PRIMARY KEY,
ename CHAR(10),
deptno NUMBER CONSTRAINT NE_FK REFERENCES
new_dept(deptno)
ON DELETE CASCADE DEFERRABLE
);
Oracle 数据库基础教程2007
由于外键约束的作用,执行下面语句时会产时错误。
INSERT INTO new_emp VALUES(1,'ZHANG',10);
*
ERROR 位于第 1 行,
ORA-02291,违反完整约束条件 (SCOTT.E_FK) - 未找到父项关键字
Oracle 数据库基础教程2007
将 new_emp表的外键约束检查延迟。
ALTER TABLE new_emp MODIFY CONSTRAINT
NE_FK INITIALLY DEFERRED;
此时,由于将 new_emp表外键约束延迟到事务结束后进行检查,因此可以先向 new_emp中插入数据,而后向
new_dept中插入数据。
INSERT INTO new_emp VALUES(1,'ZHANG',10);
INSERT INTO new_dept VALUES(10,'COMPUTER');
COMMIT;
Oracle 数据库基础教程2007
操作完后,应将 new_emp外键约束检查恢复原来状态。
ALTER TABLE new_emp MODIFY CONSTRAINT
NE_FK INITIALLY IMMEDIATE;
注意:在修改约束的检查延迟性时,如果无法确定约束的名称或需要设置多个约束的延迟性,可以一次性将所有可延迟的约束延迟或恢复。
SET CONSTRAINT ALL DEFERRED;
SET CONSTRAINT ALL IMMEDIATE;
Oracle 数据库基础教程2007
查询约束信息
ALL_CONSTRAINTS
USER_CONSTRAINTS
DBA_CONSTRAINTS
ALL_CONS_COLUMNS
USER_CONS_COLUMNS
DAB_CONS_COLUMNS
Oracle 数据库基础教程2007
从表 USER_CONSTRAINTS中查看所有约束的名字、
定义
SELECT constraint_name,constraint_type
search_condition FROM user_constraints
WHERE table_name = 'EMP';
从视图 USER_CONS_COLUMNS中查看约束关联的列
SELECT constraint_name,column_name
FROM user_cons_columns
WHERE table_name = 'EMP';
Oracle 数据库基础教程2007
10.2.3表参数设置
TABLESPACE
TABLESPACE子句用于指定表存储的表空间。
STORAGE
STORAGE子句用于设置表的存储参数。若不指定,则继承表空间的存储参数设置。
NITIAL
NEXT
PCTINCREASE
MINEXTENTS
MAXEXTENTS
BUFFER_POOL (KEEP,RECYCLE,DEFAULT)
Oracle 数据库基础教程2007
STORAGE参数设置需注意:
如果表空间管理方式为 EXTENT MANAGEMENT LOCAL
AUTOALLOCATE,则在 STORAGE中只能指定 INITIAL,
NEXT和 MINEXTENTS这 3个参数;
如果表空间管理方式为 EXTENT MANAGEMENT LOCAL
UNIFORM,则不能指定任何 STORAGE子句;
如果表空间管理方式为 EXTENT MANAGEMENT
DICTIONARY,则在 STORAG中可以设置任何参数。
Oracle 数据库基础教程2007
数据块管理参数
PCTFREE:用于指定数据块中必须保留的最小空闲空间。
PCTUSED:用于指定当数据块空闲空间达到
PCTFREE参数的限制后,数据块能够被再次使用前,
已占用的存储空间必须低于的比例。
INITRANS:用于指定能够并发访问同一个数据块的事务的数量。
MAXTRANS:用于指定能够并发访问同一个数据块的事务的最大数量。
Oracle 数据库基础教程2007
LOGGING子句
默认为 NOLOGGING,即表的创建操作不会记录到重做日志文件中,尤其适合通过查询创建表的情况。
使用 LOGGING子句,表的创建操作(包括通过查询创建表时的插入记录操作)都将记录到重做日志文件中。
LOGGING,NOLOGGING
PARALLEL,NOPARALLEL
CACHE,NOCACHE
MONITORING,NOMONITORING
Oracle 数据库基础教程2007
10.2.4修改表
基本语法
列的添加、删除、修改
约束添加、删除、修改
表参数修改
表结构重组
表重命名等
为表和列添加注释
Oracle 数据库基础教程2007
ALTER TABLE <表名 >
ADD <新列名 ><数据类型 >[ <完整性约束定义 ]
MODIFY <列名 ><数据类型 >
RENAME COLUMN oldname TO newname
SET UNUSED COLUMN column //single column
SET UNUSED COLUMNS( column1,column2… )
DROP COLUMN <col> //single column
DROP < col1,col2… > //multi column
DROP UNUSED COLUMNS
Oracle 数据库基础教程2007
添加列
语法
ALTER TABLE table_name
ADD(new_column_name datatype[NOT
NULL][DEFAULT value]);
示例
ALTER TABLE employee
ADD(phone VARCHAR2(10),hiredate DATE DEFAULT
SYSDATE NOT NULL);
Oracle 数据库基础教程2007
修改列类型
语法
ALTER TABLE table_name MODIFY column_name
new_datatype;
修改表中列类型时,必须满足下列条件:
可以增大字符类型列的长度和数值类型列的精度;
如果字符类型列、数值类型列中数据满足新的长度、精度,则可以缩小类型的长度、精度;
如果不改变字符串的长度,可以将 VARCHAR2类型和 CAHR
类型转换;
如果更改数据类型为另一种非同系列类型,则列中数据必须为
NULL。
Oracle 数据库基础教程2007
示例
ALTER TABLE employee MODIFY ename CHAR(20);
ALTER TABLE employee MODIFY phone NUMBER;
修改列名
语法
ALTER TABLE table_name RENAME COLUMN oldname
TO newname;
示例
ALTER TABLE employee RENAME COLUMN ename TO
employee_name;
Oracle 数据库基础教程2007
删除列
直接删除列语法
ALTER TABLE table_name
DROP [COLUMN
column_name]|[(column1_name,column2_name,… )]
[CASCADE CONSTRAINTS];
直接删除列示例
ALTER TABLE sc DROP COLUMN sno CASCADE
CONSTRAINTS;
ALTER TABLE employee DROP (phone,hiredate);
Oracle 数据库基础教程2007
将列标记为 UNUSED,然后进行删除。
ALTER TABLE table_name
SET UNUSED [COLUMN
column_name]|[(column1_name,column2_name,… )]
[CASCADE CONSTRAINTS];
示例
ALTER TABLE player SET UNUSED COLUMN sage;
ALTER TABLE player SET UNUSED (sname,resume);
ALTER TABLE player DROP UNUSED COLUMNS;
Oracle 数据库基础教程2007
表参数修改
可以对表的参数进行修改,包括存储参数、存储位置、
数据块设置等。
ALTER TABLE employee
PCTFREE 30 PCTUSED 60 STORAGE(NEXT 512K
PCTINCREASE 10);
注意:表创建后不能对 INITIAL,MINEXTENTS
两个参数进行修改。
Oracle 数据库基础教程2007
表结构重组
将一个非分区的表移动到一个新的数据段中,或者移动到其他的表空间中,通过这种操作可以重建表的存储结构,称为表结构重组。
语法
ALTER TABLE tbname MOVE [TABLESPACE tbs_name]
注意
直到表被完全移动到新的数据段中之后,Oracle才会删除原来的数据段;
表结构重组后,表中每个记录的 ROWID会发生变化,因此该表的所有索引失效,需要重新建立索引;
如果表中包含 LOB列,则默认情况下不移动 LOB列数据和 LOB
索引段。
Oracle 数据库基础教程2007
表重命名
语法
ALTER TABLE table_old_name RENAME TO
table_new_name;
RENAME table_old_name TO table_new_name;
说明
Oracle自动更新相应的约束、索引和与此表相关的权限;
同时以此表为参考的视图、同义词、存储过程和函数为非法。
Oracle 数据库基础教程2007
为表添加注释
语法
COMMENT ON TALBE table_name IS… ;
为列添加注释
语法
COMMENT ON COLUMN table_name.column_name IS…
注释可以通过以下数据字典来查看,
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.2.5删除表
使用 DELETE语句删减表
使用 TRUNCATE语句删减表
TRUNCATE TABLE EMP [REUSE STORAGE]
使用 DROP语句删除表
DROP TABLE EMP [CASCADE CONSTRAINTS]
DELETE,TRUNCATE,DROP 区别
Oracle 数据库基础教程2007
删除一个表同时,Oracle将执行下列操作:
删除该表中所有记录;
从数据字典中删除该表定义;
删除与该表相关的所有索引和触发器;
回收为该表分配的存储空间;
依赖于该表的数据库对象处于 INVALID状态。
Oracle 数据库基础教程2007
10.2.6利用 OEM管理表
创建表
删除表
修改表
查询表
Oracle 数据库基础教程2007
10.3索引
索引概述
索引管理
利用 OEM管理索引
Oracle 数据库基础教程2007
10.3.1索引概述
索引概念及作用
索引是为了加速对表中元组的检索而创建的一种分散存储结构;
是对表而建立的,由除存放表的数据页面以外的索引页面组成,独立于被索引的表;
通过使用索引加速行的检索,但减慢更新的速度;
快速定位数据,减少磁盘 I/O;
Oracle自动使用、维护索引
Oracle 数据库基础教程2007
索引分类
惟一性索引与非惟一性索引
平衡树索引与位图索引
单列索引与复合索引
函数索引
聚簇索引
全局索引与本地索引
Oracle 数据库基础教程2007
索引使用原则
导入数据后再创建索引
在适当的表和字段上创建索引
经常查询的记录数目少于表中所有记录总数的 5%;
经常进行连接查询表,在连接列上建立索引能够显著提高查询的速度;
对于取值范围很大的列应当创建 B树索引;
对于取值范围很小的列应当创建位图索引
不能在 LONG,LONG RAW,LOB数据类型的列上创建索引;
Oracle会自动在 PRIMARY KEY和 UNIQUE约束的列上创建惟一性索引。
合理设置复合索引中的字段顺序
Oracle 数据库基础教程2007
限制表中索引的数目
表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。
为索引设置合适的 PCTFREE参数
选择存储索引的表空间
默认情况下,索引与表存储在同一表空间中。索引与表存储在同一表空间中,有利于数据库维护操作,具有较高的可用性;
反之,若索引与表存储在不同的表空间中,则可提高系统的存取性能,减少硬盘 I/O冲突,但是表与索引可用状态可能出现不一致,如一个处于联机状态,另一个处于脱机状态。
Oracle 数据库基础教程2007
10.3.2管理索引
创建索引
修改索引
删除索引
索引的查询
Oracle 数据库基础教程2007
语法
CREATE [UNIQUE]|[BITMAP] INDEX index_name
ON table_name([column_name[ASC|DESC],… ]|
[expression])
[REVERSE]
[parameter_list];
说明
UNIQUE表示建立惟一性索引;
BITMAP表示建立位图索引;
ASC/DESC用于指定索引值的排列顺序,ASC表示按升序排序,
DESC表示按降序排序,缺省值为 ASC;
REVERSE表示建立反键索引;
parameter_list用于指定索引的存放位置、存储空间分配和数据块参数设置。
创建索引
Oracle 数据库基础教程2007
创建非惟一性索引
CREATE INDEX employee_ename ON
employee(ename)TABLESPACE users STORAGE
(INITIAL 20K NEXT 20k PCTINCREASE 75);
创建惟一性索引
CREATE UNIQUE INDEX deptartment_index ON
department(dname);
创建位图索引
CREATE BITMAP INDEX student_sex ON
student(sex);创建反序索引
创建反序索引
CREATE INDEX player_sage ON player(sage)
REVERSE;
Oracle 数据库基础教程2007
创建函数索引
CREATE INDEX idx ON
employee(UPPER(ename));
定义约束时创建索引
CREATE TABLE new_employee(
empno NUMBER(5) PRIMARY KEY USING
INDEX TABLESPACE users PCTFREE 0,
ename VARCHAR2(20)
);
Oracle 数据库基础教程2007
修改索引
修改索引的存储参数
ALTER INDEX employee_ename STORAGE
(PCTINCREASE 50);
合并索引
ALTER INDEX… COALESCE
ALTER INDEX employee_ename COALESCE;
Oracle 数据库基础教程2007
重建索引
ALTER INDEX… REBUILDER
ALTER INDEX player_sage REBUILD;
合并索引与重建索引比较合 并 索 引 重 建 索 引不能将索引移到其他表空间中 可以将索引移到其他表空间中代价较低,不需要使用额外的存储空间 代价较高,需要使用额外的存储空间只能在 B树的同一子树中进行合并,不会改变树的高度重建整个 B 树,可能会降低树的高度可以快速释放叶子节点中未使用的存储空间可以快速更改索引的存储参数。在重建过程中如果指定了 ONLINE关键字,
不会影响对当前索引的使用
Oracle 数据库基础教程2007
监视索引
ALTER INDEX … MONITORING USAGE
ALTER INDEX employee_ename
MONITORING USAGE;
ALTER INDEX employee_ename
NOMONITORING USAGE;
索引重命名
ALTER INDEX… RENAME TO …
ALTER INDEX employee_ename RENAME
TO employee_new_ename;
Oracle 数据库基础教程2007
删除索引
语法
DROP INDEX index_name;
在下面几种情况下,可以考虑删除索引
该索引不再使用。
通过一段时间监视,发现几乎没有查询或只有极少数查询会使用该索引。
由于索引中包含损坏的数据块或包含过多的存储碎片等,需要删除该索引,然后重建索引。
由于移动了表数据而导致索引失效
Oracle 数据库基础教程2007
索引的查询
DBA_INDEXES,ALL_INDEXES,USER_INDEXES
包含索引的基本描述信息和统计信息,包括索引的所有者、索引的名称、
索引的类型、对应表的名称、索引的存储参数设置、由分析得到的统计信息等信息
DBA_IND_COLUMNS,ALL_IND_COLUMNS、
USER_IND_COLUMNS
包含索引列的描述信息,包括索引的名称、表的名称和索引列的名称等信息
DBA_IND_EXPRESSIONS,ALL_IND_EXPRESSIONS、
USER_IND_EXPRESSIONS
包含函数索引的描述信息,通过该视图可以查看到函数索引的函数或表达式
V$OBJECT_USAGE
包含通过 ALTER INDEX… MONITORING USAGE语句对索引进行监视后得到的索引使用信息。
Oracle 数据库基础教程2007
10.3.3利用 OEM管理索引
创建索引
修改索引
删除索引
查询索引
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.4索引化表
索引化表概念
创建索引化表
设置溢出存储
修改索引化表
利用 OEM管理索引化表
Oracle 数据库基础教程2007
索引化表概念
索引化表( Index-Organized Table,IOT)是一种特殊的表,它按 B树的索引结构来组织和存储数据,将表的数据和索引的数据存储在一起。
主要适合于经常通过主键查询整个记录或部分记录的情况,表中记录的存放顺序与主键的顺序一致。
索引化表类似于 B树结构,不过索引条目不是标准 B树结构中索引值与 ROWID这样的结构,而是主键列与非主键列形式的结构。
Oracle 数据库基础教程2007
10.4.1创建索引化表
说明
在 CREATE TABLE语句中指定 ORGANIZATION INDEX关键字
必须建立一个 PRIMARY KEY 约束
示例
CREATE TABLE new_student(
sno NUMBER PRIMARY KEY,
sname CHAR(10),
sage NUMBER,
sex CHAR(2))
ORGANIZATION INDEX
TABLESPACE USERS ;
Oracle 数据库基础教程2007
可以通过子查询创建索引化表
CREATE TABLE new_emp(
empno PRIMARY KEY,ename)
ORGANIZATION INDEX
AS SELECT empno,ename FROM emp;
注意
利用子查询创建索引化表时,必须指定主键列和其他所有列,指定的列的个数必须与查询语句中目标列个数一致。
Oracle 数据库基础教程2007
10.4.2设置溢出存储
所谓的溢出存储是指将索引化表中每个记录分成两部分,其中一部分(包含主键列)保存在索引化表自身中(以索引的树状结构存储,称为索引条目部分),而另一部分保存在溢出表空间中
(以标准表的堆结构存储,称为溢出部分)。
若要启用溢出存储功能,必须在创建索引化表时指定 OVERFLOW子句指定溢出部分的存储空间,
同时使用 PCTTHRESHOLD子句或 INCLUDING
子句来设置溢出方式。
Oracle 数据库基础教程2007
用 PCTTHRESHOLD设置溢出存储
示例
CREATE TABLE iot_pct(
ID NUMBER PRIMARY KEY,
col1 VARCHAR2(20),
col2 VARCHAR2(10),
col3 NUMBER)
ORGANIZATION INDEX
TABLESPACE USERS
PCTTHRESHOLD 30 OVERFLOW
ABLESPACE ORCLTBS1;
Oracle 数据库基础教程2007
使用 PCTTHRESHOLD子句设置溢出比例时注意:
溢出存储是以列为单位,一个列要么全部保留在索引条目中,
要么全部溢出;
列的顺序主要取决于创建表时的列的定义顺序,但是 Oracle
会自动将主键列移动到非主键列的前面,保证主键列保存在索引条目中;
PCTTHRESHOLD子句所指定的比例必须包含索引化表中所有主键列。
Oracle 数据库基础教程2007
用 INCLUDING设置溢出存储
示例
CREATE TABLE iot_pct_include(
ID NUMBER PRIMARY KEY,
col1 VARCHAR2(20),
col2 VARCHAR2(10),
col3 NUMBER)
ORGANIZATION INDEX
TABLESPACE USERS
PCTTHRESHOLD 30
INCLUDING col3
OVERFLOW TABLESPACE ORCLTBS1;
Oracle 数据库基础教程2007
10.4.3修改索引化表
修改索引数据段与溢出数据段
重建索引化表
将索引化表转换为普通表
Oracle 数据库基础教程2007
修改索引数据段与溢出数据段
使用 ALTER TABLE语句可以对索引化表中索引数据段和溢出数据段进行修改,包括存储参数和溢出方式的修改。其中
OVERFLOW关键字之前的参数都是针对索引条目数据段的,
而 OVERFLOW之后的参数都是针对溢出数据段的。
ALTER TABLE new_student INITRANS 4 OVERFLOW
INITRANS 6;
ALTER TABLE iot_pct_includ PCTTHRESHOLD 15
INCLUDING col2;
如果原来的索引化表中没有使用溢出存储功能,可以通过
ALTER TABLE… ADD OVERFLOW为它应用溢出存储功能。
ALTER TABLE student ADD OVERFLOW TABLESPACE
ORCLTBS2
Oracle 数据库基础教程2007
重建索引化表
在不断对索引化表进行更新操作之后,将在索引化表中产生许多不连续的存储碎片,降低索引化表的查询效率。可以使用 ALTER TABLE… MOVE语句重建索引化表,以消除其中的存储碎片。
重建索引化表可以在原来的表空间中进行,也可以在新的表空间中进行。
ALTER TABLE new_student MOVE INITRANS 10;
ALTER TABLE iot_pct_include MOVE TABLESPACE
ORCLTBS2OVERFLOW TABLESPACE ORCLTBS3
Oracle 数据库基础教程2007
将索引化表转换为标准表
使用 Oracle中的 EMPORT和 IMPORT工具,将索引化表中的数据全部导出,然后再重新导入到一个标准表中。
使用 CREATE TABLE… AS SELECT语句,通过对索引化表的查询来创建一个标准表。
Oracle 数据库基础教程2007
10.4.4利用 OEM管理索引化表
创建索引化表
索引化表的其他管理
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.5分区表与分区索引
分区概述
创建分区表
创建分区索引
维护分区表与分区索引
Oracle 数据库基础教程2007
分区概述
分区概念
所谓的分区是指将一个巨型表或巨型索引分成若干独立的组成部分进行存储和管理,每一个相对小的、
可以独立管理的部分,称为原来表或索引的分区。
每个分区都具有相同的逻辑属性,但物理属性可以不同。如具有相同列、数据类型、约束等,但可以具有不同的存储参数、位于不同的表空间等。
分区后,表中每个记录或索引条目根据分区条件分散存储到不同分区中 。
Oracle 数据库基础教程2007
分区条件
表的大小超过 2GB
要对一个表进行并行 DML操作,必须分区
为了平衡硬盘的 I/O操作,将一个表分散存储在不同的表空间中,必须对它进行分区
如果需要将表一部分设置为只读,另一部分为可更新的,必须对表进行分区
Oracle 数据库基础教程2007
10.5.1创建分区表
分区方法
范围分区
列表分区
散列分区
复合分区
Oracle 数据库基础教程2007
范围分区
参数
PARTITION BY RANGE(col1,… )
PARTITION partion_name
VALUE LESS THAN
示例
,创建一个分区表,将学生信息根据其出生日期不同进行分区,将 1980年 1月 1日前出生的学生信息保存在
ORCLTBS1表空间中,1980年 1月 1日到 1990年 1月 1日出生的学生信息保存在 ORCLTBS2表空间中,其他学生信息保存在 ORCLTBS3表空间中。
Oracle 数据库基础教程2007
CREATE TABLE student_range(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sage int,
birthday DATE
)
PARTITION BY RANGE(birthday)
(PARTITION p1 VALUES LESS THAN
(TO_DATE('1980-1-1','YYYY-MM-DD')) TABLESPACE
ORCLTBS1,
PARTITION p2 VALUES LESS THAN
(TO_DATE('1990-1-1','YYYY-MM-DD')) TABLESPACE
ORCLTBS2,
PARTITION p3 VALUES LESS THAN(MAXVALUE)
TABLESPACE ORCLTBS3 STORAGE(INITIAL 10M NEXT 20M))
STORAGE(INITIAL 20M NEXT 10M MAXEXTENTS 10
);
Oracle 数据库基础教程2007
列表分区
参数
PARTITION BY LIST(col1,… )
PARTITION partition_name
VALUE
示例
创建一个分区表,将学生信息按性别不同进行分区,男学生信息保存在表空间 ORCLTBS1中,而女学生信息保存在
ORCLTBS2中 。
Oracle 数据库基础教程2007
CREATE TABLE student_list(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sex CHAR(2) CHECK(sex in ('M','F'))
)
PARTITION BY LIST(sex)
(PARTITION student_male VALUES('M') TABLESPACE
ORCLTBS1,
PARTITION student_female VALUES('F') TABLESPACE
ORCLTBS2)
STORAGE (INITIAL 10M NEXT 10M MAXEXTENTS 5
);
Oracle 数据库基础教程2007
散列分区
参数
PARITITION BY HASH( col1,… )
使用 PARTITION指定分区数量及 STORE IN指定分区存储空间;或使用 PARTITON指定每个分区名称以及其存储空间。
示例
创建一个分区表,根据学号将学生信息均匀分布到
ORCLTBS1和 ORCLTBS2两个表空间中 。
创建分区表
Oracle 数据库基础教程2007
CREATE TABLE student_hash (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10)
)
PARTITION BY HASH(sno)
(PARTITION p1 TABLESPACE ORCLTBS1,
PARTITION p2 TABLESPACE ORCLTBS2);
CREATE TABLE student_hash2 (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10) )
PARTITION BY HASH(sno)
PARTITIONS 2 STORE IN(ORCLTBS1,ORCLTBS2);
Oracle 数据库基础教程2007
复合分区
参数
PARTITION BY RANGE(col1,… )
SUBPARTITION BY HASH(col1,… )
每个子分区的子分区数量或子分区的描述。
示例
创建一个复合分区表,将 1980年 1月 1日前出生的学生信息均匀保存在 ORCLTBS1和 ORCLTBS2表空间中,1980年 1月 1
日到 1990年 1月 1日出生的学生信息保存在 ORCLTBS3和
ORCLTBS4表空间中,其他学生信息保存在 ORCLTBS5表空间中 。
Oracle 数据库基础教程2007
CREATE TABLE student_composition(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sage NUMBER(4),
birthday DATE
)
PARTITION BY RANGE(birthday)
SUBPARTITION BY HASH(sage)
(PARTITION p1 VALUES LESS THAN(TO_DATE('1980-1-1','YYYY-MM-DD'))
(SUBPARTITION p1_sub1 TABLESPACE ORCLTBS1,
SUBPARTITION p1_sub2 TABLESPACE ORCLTBS2),
PARTITION p2 VALUES LESS THAN(TO_DATE('1990-1-1','YYYY-MM-
DD'))
(SUBPARTITION p2_sub1 TABLESPACE ORCLTBS3,
SUBPARTITION p2_sub2 TABLESPACE ORCLTBS4),
PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE
ORCLTBS5
);
Oracle 数据库基础教程2007
四种分区方法的比较
Oracle 数据库基础教程2007
10.5.2创建分区索引
分区索引类型
创建分区索引
Oracle 数据库基础教程2007
分区索引类型
本地分区索引
本地分区索引是指为分区表中的各个分区单独建立索引分区,
各个索引分区之间是相互独立的。
全局分区索引
全局分区索引是指先对整个分区表建立索引,然后再对索引进行分区。
全局非分区索引
全局非分区索引是指对整个分区表创建标准的未分区的索引。
Oracle 数据库基础教程2007
创建本地分区索引
分区表创建后,可以对分区表创建本地分区索引。在指明分区方法时使用 LOCAL关键字标识本地分区索引。
CREATE INDEX student_range_local ON
student_range(sname) LOCAL;
创建全局分区索引
索引分区方法也包括范围分区、列表分区、散列分区和复合分区 4
种。在指明分区方法时使用 GLOBAL关键字标识全局分区索引。
CREATE INDEX student_range_global ON
student_range(sage)
GLOBAL PARTITION BY RANGE(sage)
(PARTITION p1 VALUES LESS THAN (80)
TABLESPACE ORCLTBS1,
PARTITION p2 VALUES LESS THAN (MAXVALUE)
TABLESPACE ORCLTBS2
);
Oracle 数据库基础教程2007
全局非分区索引
为分区表创建全局非分区索引与为标准表创建索引一样。例如,为分区表 student_list_index创建全局非分区索引,语句为:
CREATE INDEX student_list_index ON
student_list(sname);
Oracle 数据库基础教程2007
10.5.3维护分区表与分区索引
使用 ALTER TABLE语句来维护分区表,包括增加分区、合并分区、删除分区、交换分区、融合分区、修改分区增加值、修改分区删除值、移动分区、更名分区、分割分区、舍弃分区等。
ALTER TABLE student_hash ADD
PARTITION p3 TABLESPACE ORCLTBS3;
ALTER TABLE student_range MERGE
PARTITIONS p1,p2 INTO PARTITION p1;
Oracle 数据库基础教程2007
10.6其他模式对象
簇
视图
序列
同义词
数据库链接
Oracle 数据库基础教程2007
10.6.1簇
簇的概念
创建簇
创建聚簇表
修改簇
创建聚簇索引
删除簇
查询簇信息
利用 OEM管理簇
Oracle 数据库基础教程2007
簇的概念
簇是一种存储表数据的方法,一个簇由共享相同数据块的一组表组成。
在一个簇中,Oracle将多个表中具有相同相关列的记录聚簇在相同的数据块中(类似于连接结果)。
对于经常需要访问这些列的应用来说,能够减少硬盘
I/O时间、改善连接查询的效率。
Oracle 数据库基础教程2007
创建簇
在数据库中,簇占据实际的存储空间,因此用户必须具有足够的表空间配额。
CREATE CLUSTER student_class (class_id
NUMBER(3))
SIZE 600
TABLESPACE users
STORAGE (INITIAL 200K NEXT 300K
MINEXTENTS 2 MAXEXTENTS 20);
Oracle 数据库基础教程2007
创建聚簇表
通过将两个或多个聚簇表保存在同一个簇中,可以将两个表中具有相同的聚簇字段值的记录集中存放在同一个数据块(或相邻的多个数据块)中。
CREATE TABLE classes(
class_id NUMBER(3) PRIMARY KEY,
cname VARCHAR2(10) )
CLUSTER student_class (class_id);
CREATE TABLE students (
sno NUMBER(5) PRIMARY KEY,
sname VARCHAR2(15) NOT NULL,
class_id NUMBER(3) REFERENCES classes)
CLUSTER student_class(class_id);
注意:聚簇表中的聚簇字段必须与创建簇时指定的聚簇字段具有相同的名称和数据类型。
Oracle 数据库基础教程2007
修改簇
簇创建之后,用户可以对簇进行修改,包括:修改簇的物理存储参数( PCTFREE,PCTUSED,
STORAGE等)、修改 SIZE值的大小。
ALTER CLUSTER student_class PCTFREE
30 PCTUSED 60;
注意:不能修改聚簇表的 PCTFREE,PCTUSED、
INITRANS和 MAXTRANS参数。这些参数是由簇的物理存储参数设置的。
Oracle 数据库基础教程2007
创建聚簇索引
可以为簇中的聚族字段创建索引,这种类型的索引称为,聚簇索引,。
聚簇索引必须在向簇中的聚簇表中插入任何记录之前创建。
聚簇表中数据的存储顺序与聚簇索引中索引值排序相一致。
CREATE INDEX student_class_index
ON CLUSTER student_class
TABLESPACE USERS
STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 2
MAXEXTENTS 10) PCTFREE 10;
Oracle 数据库基础教程2007
根据簇中是否包含表,簇删除可以分为下列 3中情况。
使用 DROP CLUSTER删除不包含聚簇表的簇及簇索引。
DROP CLUSTER student_class;
使用 DROP CLUSTER...INCLUDING TABLES语句删除包含聚簇表的簇。
DROP CLUSTER student_class INCLUDING TABLES;
如果聚簇表中包含其他表外键参考的主键约束列或惟一性约束列,
则需要使用 CASCADE CONSTRAINTS子句删除约束同时删除簇。
DROP CLUSTER student_class INCLUDING TABLES
CASCADE CONSTRAINTS;
Oracle 数据库基础教程2007
查询簇信息
DBA_CLUSTERS:包含数据库中所有簇的信息。
ALL_CLUSTERS:包含当前用户可以访问的簇的信息。
US ER_CLUSTERS:包含当前用户的所有簇的信息。
DBA_CLU_COLUMNS:包含数据库中所有聚簇列信息。
USER_CLU_COLUMNS:包含当前用户所有聚簇列信息。
Oracle 数据库基础教程2007
利用 OEM管理簇
创建簇
删除簇
修改簇
查询簇
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.6.2视图
视图概念及作用
创建视图
视图操作
修改视图
删除视图
利用 OEM管理视图
Oracle 数据库基础教程2007
视图概念及作用
视图是从一个或多个表或视图中提取出来的数据的一种表现形式。在数据库中只有视图的定义,而没有实际对应,表,的存在,因此视图是一个,虚,表。当对视图进行操作时,系统根据视图定义临时生成数据。
通过视图的使用可以提高数据安全性、隐藏数据的复杂性、简化查询语句、分离应用程序与基础表、保存复杂查询等。
Oracle 数据库基础教程2007
创建视图
语法
CREATE OR REPLACE VIEW [schema.]view_name
[(column1,column2,… )]
AS subquery
[WITH READ ONLY]|[WITH CHECK
OPTION][CONSTRIANT constraint];
说明
Subquery为子查询,决定了视图中数据的来源;
WITH READ ONLY指明该视图为只读视图,不能修改;
WITH CHECK OPTION指明在使用视图时,检查数据是否符合子查询中的约束条件;
CONSTRAINT constraint为使用 WITH CHECK OPTION选项时指定的约束命名
Oracle 数据库基础教程2007
CREATE VIEW emp_info_view(deptno,avgsal,empcount)
AS
SELECT deptno,avg(sal),count(*) FROM emp
GROUP BY deptno;
CREATE VIEW emp_sal_view
AS
SELECT * FROM emp WHERE sal>2000
WITH CHECK OPTION;
CREATE VIEW emp_dept_view
AS
SELECT empno,ename,dname FROM emp,dept
WHERE emp.deptno=dept.deptno
Oracle 数据库基础教程2007
视图操作
视图创建后,就可以对视图进行操作,包括数据查询,DML操作
(数据的插入、删除、修改)等。因为视图是,虚表,,因此对视图的操作最终转换为对基本表的操作。
对视图的查询象对标准表查询一样,但是对视图执行 DML操作时需要注意,如果视图定义包括下列任何一项,则不可直接对视图进行插入、删除和修改等操作,需要通过触发器来实现。
集合操作符 ( UNION,UNION ALL,MINUS,INTERSECT)。
聚集函数( SUM,AVG等)。
GROUP BY,CONNECT BY,或 START WITH子句。
DISTINCT操作符。
(部分)连接操作。
Oracle 数据库基础教程2007
修改视图
可以采用 CREATE OR REPLACE VIEW 语句修改视图,实质是删除原视图并重建该视图,但是会保留该视图上授予的各种权限。
CREATE OR REPLACE VIEW
emp_dept_view
AS
SELECT empno,ename,sal,dname FROM
emp,dept WHERE
emp.deptno=dept.deptno;
Oracle 数据库基础教程2007
删除视图
可以使用 DROP VIEW语句删除视图。删除视图后,
该视图的定义从数据字典中删除,同时该视图上的权限被回收,但是对数据库表没有任何影响。
DROP VIEW emp_dept_view;
Oracle 数据库基础教程2007
利用 OEM管理视图
视图的创建、查看、修改和删除等。
Oracle 数据库基础教程2007
10.6.3序列
序列的概念
创建序列
使用序列
修改序列
删除序列
利用 OEM管理序列
Oracle 数据库基础教程2007
序列的概念
序列用于产生惟一序号的数据库对象,用于为多个数据库用户依次生成不重复的连续整数。
通常使用序列自动生成表中的主键值。
序列产生的数字最大长度可达到 38位十进制数。
序列不占用实际的存储空间,在数据字典中只存储序列的定义描述。
Oracle 数据库基础教程2007
创建序列
语法
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
示例
CREATE SEQUENCE stud_sequence INCREMENT BY 1
START WITH 100 MAXVALUE 1000;
Oracle 数据库基础教程2007
参数说明
INCREMENT BY子句用于设置相邻两个元素之间的差值,即步长,默认值为 1;
START WITH子句用于设置序列初始值,默认值为 1;
MAXVALUE|NO MAXVALUE子句用于设置序列有无最大值,
默认为无;
MINVALUE|NOMINVALUE子句用于设置序列有无最小值,
默认为无;
CYCLE|NOCYCLE子句用于设置序列是否可以循环,默认为不可循环;
CACHE|NOCACHE子句用于设置是否在缓存中预先分配一定数量的数据值,以提高获取序列值的速度,默认为不缓存。
Oracle 数据库基础教程2007
使用序列
属性
CURRVAL:返回序列当前值。
NEXTVAL:返回当前序列值增加一个步长后的值。
注意
序列值可以应用于查询的选择列表,INSERT语句的
VALUES子句,UPDATE语句的 SET子句,但不能应用在
WHERE子句或 PL/SQL过程性语句中。
示例
INSERT INTO students(sno,sname)
VALUES(stud_sequence.nextval,'JOAN');
SELECT stud_sequence.currval FROM dual;
Oracle 数据库基础教程2007
修改序列
除了不能修改序列起始值外,可以对序列其他任何子句和参数进行修改。
修改结构只对已用使用序列生效。
ALTER SEQUENCE stud_sequence
INCREMENT BY 10
MAXVALUE 10000 CYCLE CACHE 20;
Oracle 数据库基础教程2007
删除序列
当一个序列不再需要时,可以使用 DROP
SEQUENCE语句删除序列。
DROP SEQUENCE stud_sequence;
Oracle 数据库基础教程2007
利用 OEM管理序列
包括序列的创建、查看、修改和删除等。
Oracle 数据库基础教程2007
10.6.4同义词
同义词概述
创建同义词
删除同义词
利用 OEM管理同义词
Oracle 数据库基础教程2007
同义词概述
同义词是数据库中表、索引、视图或其他模式对象的一个别名。利用同义词,一方面为数据库对象提供一定的安全性保证,例如可以隐藏对象的实际名称和所有者信息,或隐藏分布式数据库中远程对象的位置信息;另一个方面是简化对象访问。此外,当数据库对象改变时,只需要修改同义词而不需要修改应用程序。
同义词分为私有同义词和公有同义词两种。私有同义词只能被创建它的用户所拥有,该用户可以控制其他用户是否有权使用该同义词;公有同义词被用户组
PUBLIC拥有,数据库所有用户都可以使用公有同义词。
Oracle 数据库基础教程2007
创建同义词
语法
CREATE [PUBLIC] SYNONYM synonym_name FOR
object_name;
示例
CREATE PUBLIC SYNONYM scottemp FOR scott.emp;
利用同义词可以实现对数据库对象的操作
UPDATE scottemp SET ename='SFD‘
WHERE empno=7884;
Oracle 数据库基础教程2007
删除同义词
语法
DROP [PUBLIC] SYNONYM synonym_name;
示例
DROP PUBLIC SYNONYM scottemp;
Oracle 数据库基础教程2007
利用 OEM管理同义词
同义词的创建、查看和删除等。
Oracle 数据库基础教程2007
10.6.5数据库链接
概述
创建数据库链接
利用 OEM管理数据库链接
Oracle 数据库基础教程2007
数据库链接概述
数据库链接是在分布式数据库应用环境中的一个数据库与另一个数据库之间的通信途径,将远程数据库映射到本地。所有能够访问本地数据库链接的应用程序即可访问远程数据库中的模式对象。
当用户正在访问一个本地数据库同时,需要访问其他非本地数据库的数据时,就需要使用数据库链接。数据库链接分为私有和公有两种类型。
Oracle 数据库基础教程2007
创建数据库链接
语法
CREATE [PUBLIC] DATABASE LINK dlink
[CONNECT TO [CURRENT USER]|[user IDENTIFIED
BY password]]
USING connect_string ;
参数说明
CONNECT TO子句用于设置与远程数据库建立连接的方式;
CURRENT USER子句指明用当前数据库用户连接远程数据库;
user IDENTIFIED BY password用于设置连接远程数据库的用户名和口令;
USING connect_string用于指定远程数据库在本地的服务命名。
Oracle 数据库基础教程2007
假设远程数据库在本地的服务命名为
backup_database,建立一个到远程数据库的连接
CREATE DATABASE LINK example_backup
CONNECT TO scott IDENTIFIED BY tiger
USING 'backup_database' ;
可以利用数据库链接更新远程数据库上的 emp表。
例如,修改远程数据库中员工工资,语句为:
UPDATE emp@example_backup SET
sal=sal+100;
Oracle 数据库基础教程2007
利用 OEM管理数据库链接
包括数据库链接的创建、查看和删除等。
Oracle 数据库基础教程2007
小结
表及其管理
索引及其管理
索引化表及其管理
分区表和分区索引的管理
簇的管理
视图、序列、同义词、数据库链接的管理
第 10章 模式对象
Oracle 数据库基础教程2007
本章内容
模式概念
表管理
索引管理
索引化表管理
分区表与分区索引的管理
簇、视图、序列、同义词、数据库链接管理
Oracle 数据库基础教程2007
本章要求
掌握表的管理
掌握索引的管理
掌握索引化表的概念及其管理
掌握分区的概念及分区管理
了解簇、视图、序列、同义词、数据库链接等的管理
Oracle 数据库基础教程2007
10.1模式
模式概念
模式与用户的关系
模式选择与切换
Oracle 数据库基础教程2007
模式概念
是指一系列逻辑数据结构或对象的集合。
模式与用户的关系
模式与用户相对应,一个模式只能被一个数据库用户所拥有,并且模式的名称与这个用户的名称相同。
通常情况下,用户所创建数据库对象都保存在与自己同名的模式中。
同一模式中数据库对象的名称必须惟一,而在不同模式中的数据库对象可以同名。
默认情况下,用户引用的对象是与自己同名模式中的对象,如果要引用其他模式中的对象,需要在该对象名之前指明对象所属模式。
Oracle 数据库基础教程2007
模式选择与切换
如果用户以 NORMAL身份登录,则进入同名模式;
若以 SYSDBA身份登录,则进入 SYS模式;
如果以 SYSOPER身份登录,则进入 PUBLIC模式。
Oracle 数据库基础教程2007
10.2表
Oracle常用数据类型
表的创建
表中约束的管理
表参数设置
表的修改
表的删除
利用 OEM管理表
Oracle 数据库基础教程2007
CREATE TABLE table_name
(column_name datatype
[column_level_constraint]
[,column_name datatype
[column_level_constraint]… ]
[,table_level_constraint])
[parameter_list]
直接创建表
Oracle 数据库基础教程2007
CREATE TABLE employee(
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15),
deptno NUMBER(3) NOT NULL CONSTRAINT
fk_emp REFERENCES dept
)
TABLESPACE USERS
PCTFREE 10 PCTUSED 40
STORAGE(INITIAL 50K NEXT 50K
MAXEXTENTS 10 PCTINCREASE 25);
Oracle 数据库基础教程2007
表名 ( table_name)
必须是合法标识符,长度为 1~ 30 字节,并且以字母开头,可以包含字母 (A~ Z,a~ z)、数字( 0~ 9),
下划线( _)、美元符号( $)和井号( #)。此外,
表名称不能是 Oracle数据库的保留字
数据类型 (datatype)
字符类型
数字类型
日期类型
大对象类型
其他类型
Oracle 数据库基础教程2007
CHAR( n)
定长字符串,n的取值范围为 1-2000字节
VARCHAR2( n)
可变字符串,n取值范围为 1-4000字节
自动调整数据长度
NCHAR(n)
用来存储 Unicode类型字符串。
NVARCHAR2(n)
它用来存储 Unicode类型字符串。
LONG
可变长字符列,最大长度为 2GB
用于不需设置成索引的字符,不常用字符类型
Oracle 数据库基础教程2007
数字数据类型
NUMBER( m,n)
可变长的数值列,m是所有有效数字的位数,n
为小数点后的位数
Oracle 数据库基础教程2007
日期数据类型
DATE
公元前 4712年 1月 1日到公元 4712年 1月 1日
默认格式,DD-MON-YY
习惯格式,YYYY-MM-DD HH,MM,SS
Oracle 数据库基础教程2007
大对象数据类型
BLOB,CLOB,NCLOB
用来保存较大的图形文件或带格式的文本文件、音频和视频等非文本文件
最大长度 4GB
BFILE
在数据库外部保存的大型二进制对象文件。
不能写,只能读、查询
大小有操作系统决定
Oracle 数据库基础教程2007
其他数据类型
RAW( n)
可变长二进制数据
保存较小的图形文件或带格式的文本文件
N取 1-2000字节
LONG RAW
可变长二进制数据
保存较大的图形文件或带格式的文本文件
N取 2GB字节
ROWID
UROWID
Oracle 数据库基础教程2007
约束( constraint)
在 Oracle数据库中对列的约束包括主键约束、惟一性约束、检查约束、外键约束和空 /非空约束等 5中,定义方法有表级约束和列级约束 2种。关于表的约束详见
10.2.2表约束中介绍。
参数( parameter_list)
在定义表时,可以通过参数设置表存储在哪一个表空间中,和存储空间分配等。
Oracle 数据库基础教程2007
利用子查询创建表
语法
CREATE TABLE table_name
(column_name [column_level_constraint]
[,column_name [column_level_constraint]… ]
[,table_level_constraint])
[parameter_list]
AS subquery;
Oracle 数据库基础教程2007
注意
通过该方法创建表时,可以修改表中列的名称,
但是不能修改列的数据类型和长度;
源表中的约束条件和列的缺省值都不会复制到新表中;
子查询中不能包含 LOB类型和 LONG类型列;
当子查询条件为真时,新表中包含查询到的数据;当查询条件为假时,则创建一个空表。
Oracle 数据库基础教程2007
创建一个表,保存工资高于 3000的员工的员工号、
员工名和部门号。语句为:
CREATE TABLE emp_select(
emp_no,emp_name,dept_no
)
AS
SELECT empno,ename,deptno FROM
employee WHERE sal>3000;
Oracle 数据库基础教程2007
CREATE TABLE EMP_SELECT ( EMPNO,ENAME,JOB,DEPTNO,
SALARY)
PCTFREE 10
PCTUSED 40
TABLESPACE users
STORAGE (INITIAL 50K NEXT 50K MAXEXTENTS 10
PCTINCREASE 25)
AS
SELECT EMPNO,ENAME,JOB,EDPTNO,SAL FROM
EMPLOYEES WHERE SAL>1000
Oracle 数据库基础教程2007
创建临时表
临时表中的数据在特定条件下自动释放,但其结构将一直存在。
临时表中的数据只在当前会话或当前事务中是有效的。
根据临时表中数据被释放的时间不同,临时表分为事务级别的临时表和会话级别的临时表两类。
ON COMMIT DELETE ROWS //事务级临时表
ON COMMIT PRESERVE ROWS //会话级临时表
Oracle 数据库基础教程2007
事务级别的临时表是在事务提交时系统自动删除表中所有记录。
CREATE GLOBAL TEMPORARY TABLE
tran_temp(
ID NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
)
ON COMMIT DELETE ROWS;
Oracle 数据库基础教程2007
会话级别的临时表是在会话终止时系统自动删除表中所有记录 。
CREATE GLOBAL TEMPORARY TABLE
sess_temp(
ID NUMBER(2) PRIMARY KEY,
name VARCHAR2(20)
)
ON COMMIT PRESERVE ROWS;
Oracle 数据库基础教程2007
10.2.2表约束
约束的类别
定义约束
添加和删除约束
设置约束状态
约束的延迟检查
查询约束信息
Oracle 数据库基础教程2007
约束的类别
约束作用
是在表中定义的用于维护数据库完整性的一些规则。
通过对表中列定义约束,可以防止在执行 DML操作时,
将不符合要求的数据插入到表中。
约束类型
PRIMARY KEY
UNIQUE
CHECK
FOREIGN KEY
NULL/NOT NULL
Oracle 数据库基础教程2007
PRIMARY KEY
特点
定义主键,起惟一标识作用,其值不能为
NULL,也不能重复;
一个表中只能定义一个主键约束;
建立主键约束的同时,在该列上建立一个惟一性索引,可以为它指定存储位置和存储参数;
主键约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
UNIQUE
特点
定义为惟一性约束的某一列或多个列的组合的取值必须惟一;
如果某一列或多个列仅定义惟一性约束,而没有定义非空约束,则该约束列可以包含多个空值;
Oracle自动在惟一性约束列上建立一个惟一性索引,可以为它指定存储位置和存储参数;
惟一性约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
在一个基本表中只能定义一个 PRIMARY KEY约束,
但可定义多个 UNIQUE约束;
对于指定为 PRIMARY KEY的一个列或多个列的组合,
其中任何一个列都不能出现空值,而对于 UNIQUE所约束的唯一键,则允许为空。
不能为同一个列或一组列既定义 UNIQUE约束,又定义 PRIMARY KEY约束。
PRIMARY KEY与 UNIQUE比较
Oracle 数据库基础教程2007
CHECK
特点
检查约束用来限制列值所允许的取值范围,其表达式中必须引用相应列,并且表达式的计算结果必须是一个布尔值;
约束表达式中不能包含子查询,也不能包含
SYSDATE,USER等 SQL函数,和 ROWID、
ROWNUM等伪列;
一个列可以定义多个检查约束;
检查约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
概念
FOREIGN KEY约束指定某一个列或一组列作为外部键,其中,包含外部键的表称为从表,包含外部键所引用的主键或唯一键的表称主表。
系统保证从表在外部键上的取值要么是主表中某一个主键值或唯一键值,要么取空值。
以此保证两个表之间的连接,确保了实体的参照完整性。
FOREIGN KEY
Oracle 数据库基础教程2007
FOREIGN KEY
特点
定义外键约束的列的取值要么是主表参照列的值,要么为空;
外键列只能参照于主表中的主键约束列或惟一性约束列;
可以在一列或多列组合上定义外键约束;
外键约束可以是列级约束,也可以是表级约束。
Oracle 数据库基础教程2007
NULL/NOT NULL
特点
在同一个表中可以定义多个 NOT NULL约束;
只能是列级约束。
Oracle 数据库基础教程2007
定义约束
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,
不必指定列名 ;
表约束与列定义相互独立,不包括在列定义中。
通常用于对多个列一起进行约束,与列定义用 ’,’
分隔。定义表约束时必须指出要约束的那些列的名称。
Oracle 数据库基础教程2007
定义列级约束的语法为:
[CONSTRAINT constraint_name]
constraint_type [conditioin];
定义表级约束的语法为:
[CONSTRAINT constraint_name]
constraint_type([column1_name,
column2_name,… ]|[condition]);
注意
Oracle约束通过名称进行标识。在定义时可以通过
CONSTRAINT关键字为约束命名。如果用户没有为约束命名,Oracle将自动为约束命名。
Oracle 数据库基础教程2007
CREATE TABLE student(
sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,
sname VARCHAR2(10) NOT NULL,
sex CHAR(2) CONSTRAINT S_CK1 check(sex in('M','F')),
sage NUMBER(6,2),
CONSTRAINT S_CK2 CHECK(sage between 18 and 60)
);
CREATE TABLE course(
cno NUMBER(6) PRIMARY KEY,
cname CHAR(20) UNIQUE
USING INDEX TABLESPACE indx STORAGE(INITIAL 64K
NEXT 64K)
);
Oracle 数据库基础教程2007
定义列级 FOREIGN KEY约束
[CONSTRAINT constraint_name]
[FOREIGN KEY]
REFERENCES ref_table_name (column_name,… )
定义表级 FOREIGN KEY约束
[CONSTRAINT constraint_name]
FOREIGN KEY (column_name,… )
REFERENCES ref_table_name (column_name,… )
[ON DELETE CASCADE|SET NULL];
Oracle 数据库基础教程2007
ON DELETE CASCADE
删除子表中所有相关记录
ON DELETE SET NULL
将子表中相关记录的外键约束列值设置为 NULL
ON DELETE RESTRICTED
受限删除,即如果子表中有相关子记录存在,则不能删除主表中的父记录,默认引用方式。
Oracle 数据库基础教程2007
DEFAULT
如果用户在插入新行时没有显示为列提供数据,系统将默认值赋给该列。
语法
[CONSTRAINT <约束名 > ] DEFAULT 表达式
Oracle 数据库基础教程2007
添加约束
添加约束语法为:
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name]
constraint_type(column1_name,column2_
name,… )[condition];
Oracle 数据库基础教程2007
创建一个表
CREATE TABLE player(
ID NUMBER(6),
sno NUMBER(6),
sname VARCHAR2(10),
sage NUMBER(6,2),
resume VARCHAR2(1000)
);
添加主键约束
ALTER TABLE player ADD CONSTRAINT P_PK
PRIMARY KEY(ID);
添加惟一性约束
ALTER TABLE player ADD CONSTRAINT P_UK
UNIQUE(sname);
Oracle 数据库基础教程2007
添加检查约束
ALTER TABLE player ADD CONSTRAINT P_CK
CHECK(sage BETWEEN 20 AND 30);
添加外键约束
ALTER TABLE player
ADD CONSTRAINT P_FK FOREIGN
KEY(sno)REFERENCES student(sno) ON DELETE
CASCADE;
添加空 /非空约束
注意,为表列添加空 /非空约束时必须使用 MODIFY子句代替
ADD子句。
ALTER TABLE player MODIFY resume NOT NULL;
ALTER TABLE player MODIFY resume NULL;
Oracle 数据库基础教程2007
修改约束
ALTER TABLE <table_name>
ADD <constraint>
MODIFY <constraint >
ENABLE <constraint >
DISABLE <constraint >
DROP <constraint >
Oracle 数据库基础教程2007
删除约束
删除指定内容的约束
ALTER TABLE player DROP UNIQUE(sname);
删除指定名称的约束
ALTER TABLE player DROP CONSTRAINT P_CK;
如果要在删除主键约束、惟一性约束同时保留惟一性索引,
则必须在 ALTER TABLE… DORP 语句中指定 KEEP
INDEX 子句。
ALTER TABLE player DROP CONSTRAINT P_UK
KEEP INDEX;
如果要删除约束同时,删除引用该约束的其他约束,则需要在 ALTER TABLE… DORP语句中指定 CASCADE关键字。
ALTER TABLE player DROP CONSTRAINT P_PK
CASCADE;
Oracle 数据库基础教程2007
设置约束状态
激活( ENABLE)状态
当约束处于激活状态时,约束将对表的插入或更新操作进行检查,与约束规则冲突的操作被回退。
禁用( DISABLE)状态
当约束处于禁用状态时,约束不起作用,与约束规则冲突的插入或更新操作也能够成功执行。
利用 SQL*Loader从外部数据源提取大量数据到数据库中;
进行数据库中数据的大量导入、导出操作;
针对表执行一项包含大量数据操作的批处理工作时。
Oracle 数据库基础教程2007
禁用约束
在定义约束时,可以将约束设置为禁用状态,默认为激活状态。也可以在约束创建后,修改约束状态为禁用。
创建表时禁用约束
CREATE TABLE S (SNO CHAR(10) PRIMARY KEY
DISALBE,… );
利用 ALTER TABLE… DISABLE禁用约束
ALTER TABLE STUDENT DISABLE CONSTRAINT
S_CK1;
ALTER TABLE STUDENT DISABLE UNIQUE (sname);
Oracle 数据库基础教程2007
禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引。若在禁用约束时,
保留对应的惟一性索引,可使用 ALTER
TABLE… DISABLE… KEEP INDEX语句。
ALTER TABLE STUDENT DISABLE UNIQUE (sname) KEEP
INDEX;
ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP
INDEX;
若当前约束 (主键约束、惟一性约束 )列被引用,则需要使用
ALTER TABLE… DISABLE… CASCADE语句同时禁用引用该约束的约束。
ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP
INDEX CASCADE;
Oracle 数据库基础教程2007
激活约束
创建或添加约束时,默认为激活状态。
利用 ALTER TABLE… ENABLE… 语句激活约束
ALTER TABLE STUDENT ENABLE UNIQUE (sname);
禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引,可以为索引设置存储位置和存储参数 (索引与表尽量分开存储 )。
ALTER TABLE STUDENT ENABLE PRIMARY KEY
USING INDEX TABLESPACE indx STORAGE(INITIAL 32K
NEXT 16K);
通过 ALTER TABLE… MODIFY… DISABLE|ENABLE语句改变约束状态
ALTER TABLE STUDENT MODIFY CONSTRAINT S_CK2
DISABLE;
Oracle 数据库基础教程2007
约束的延迟检查
默认情况下,在表中的约束都是不可延迟约束,Oracle在一条 DML语句执行完毕之后立即进行约束检查(除非禁用)。
创建约束时可以显式使用 DEFERRABLE关键字,创建可延迟的约束。
INITIALLY IMMEDIATE 或 INITIALLY DEFERRED说明可延迟约束在初始状态下是立即检查还是延迟检查
如果在定义约束时设定为不可延迟,则约束创建后不能更改其可延迟性。只有创建时设定为可延迟的约束,创建后才能更改其可延迟性。
Oracle 数据库基础教程2007
创建两个表,其约束都是可延迟的。
CREATE TABLE new_dept(
deptno NUMBER PRIMARY KEY DEFERRABLE
INITIALLY IMMEDIATE,
dname CHAR(10) UNIQUE
);
CREATE TABLE new_emp(
empno NUMBER PRIMARY KEY,
ename CHAR(10),
deptno NUMBER CONSTRAINT NE_FK REFERENCES
new_dept(deptno)
ON DELETE CASCADE DEFERRABLE
);
Oracle 数据库基础教程2007
由于外键约束的作用,执行下面语句时会产时错误。
INSERT INTO new_emp VALUES(1,'ZHANG',10);
*
ERROR 位于第 1 行,
ORA-02291,违反完整约束条件 (SCOTT.E_FK) - 未找到父项关键字
Oracle 数据库基础教程2007
将 new_emp表的外键约束检查延迟。
ALTER TABLE new_emp MODIFY CONSTRAINT
NE_FK INITIALLY DEFERRED;
此时,由于将 new_emp表外键约束延迟到事务结束后进行检查,因此可以先向 new_emp中插入数据,而后向
new_dept中插入数据。
INSERT INTO new_emp VALUES(1,'ZHANG',10);
INSERT INTO new_dept VALUES(10,'COMPUTER');
COMMIT;
Oracle 数据库基础教程2007
操作完后,应将 new_emp外键约束检查恢复原来状态。
ALTER TABLE new_emp MODIFY CONSTRAINT
NE_FK INITIALLY IMMEDIATE;
注意:在修改约束的检查延迟性时,如果无法确定约束的名称或需要设置多个约束的延迟性,可以一次性将所有可延迟的约束延迟或恢复。
SET CONSTRAINT ALL DEFERRED;
SET CONSTRAINT ALL IMMEDIATE;
Oracle 数据库基础教程2007
查询约束信息
ALL_CONSTRAINTS
USER_CONSTRAINTS
DBA_CONSTRAINTS
ALL_CONS_COLUMNS
USER_CONS_COLUMNS
DAB_CONS_COLUMNS
Oracle 数据库基础教程2007
从表 USER_CONSTRAINTS中查看所有约束的名字、
定义
SELECT constraint_name,constraint_type
search_condition FROM user_constraints
WHERE table_name = 'EMP';
从视图 USER_CONS_COLUMNS中查看约束关联的列
SELECT constraint_name,column_name
FROM user_cons_columns
WHERE table_name = 'EMP';
Oracle 数据库基础教程2007
10.2.3表参数设置
TABLESPACE
TABLESPACE子句用于指定表存储的表空间。
STORAGE
STORAGE子句用于设置表的存储参数。若不指定,则继承表空间的存储参数设置。
NITIAL
NEXT
PCTINCREASE
MINEXTENTS
MAXEXTENTS
BUFFER_POOL (KEEP,RECYCLE,DEFAULT)
Oracle 数据库基础教程2007
STORAGE参数设置需注意:
如果表空间管理方式为 EXTENT MANAGEMENT LOCAL
AUTOALLOCATE,则在 STORAGE中只能指定 INITIAL,
NEXT和 MINEXTENTS这 3个参数;
如果表空间管理方式为 EXTENT MANAGEMENT LOCAL
UNIFORM,则不能指定任何 STORAGE子句;
如果表空间管理方式为 EXTENT MANAGEMENT
DICTIONARY,则在 STORAG中可以设置任何参数。
Oracle 数据库基础教程2007
数据块管理参数
PCTFREE:用于指定数据块中必须保留的最小空闲空间。
PCTUSED:用于指定当数据块空闲空间达到
PCTFREE参数的限制后,数据块能够被再次使用前,
已占用的存储空间必须低于的比例。
INITRANS:用于指定能够并发访问同一个数据块的事务的数量。
MAXTRANS:用于指定能够并发访问同一个数据块的事务的最大数量。
Oracle 数据库基础教程2007
LOGGING子句
默认为 NOLOGGING,即表的创建操作不会记录到重做日志文件中,尤其适合通过查询创建表的情况。
使用 LOGGING子句,表的创建操作(包括通过查询创建表时的插入记录操作)都将记录到重做日志文件中。
LOGGING,NOLOGGING
PARALLEL,NOPARALLEL
CACHE,NOCACHE
MONITORING,NOMONITORING
Oracle 数据库基础教程2007
10.2.4修改表
基本语法
列的添加、删除、修改
约束添加、删除、修改
表参数修改
表结构重组
表重命名等
为表和列添加注释
Oracle 数据库基础教程2007
ALTER TABLE <表名 >
ADD <新列名 ><数据类型 >[ <完整性约束定义 ]
MODIFY <列名 ><数据类型 >
RENAME COLUMN oldname TO newname
SET UNUSED COLUMN column //single column
SET UNUSED COLUMNS( column1,column2… )
DROP COLUMN <col> //single column
DROP < col1,col2… > //multi column
DROP UNUSED COLUMNS
Oracle 数据库基础教程2007
添加列
语法
ALTER TABLE table_name
ADD(new_column_name datatype[NOT
NULL][DEFAULT value]);
示例
ALTER TABLE employee
ADD(phone VARCHAR2(10),hiredate DATE DEFAULT
SYSDATE NOT NULL);
Oracle 数据库基础教程2007
修改列类型
语法
ALTER TABLE table_name MODIFY column_name
new_datatype;
修改表中列类型时,必须满足下列条件:
可以增大字符类型列的长度和数值类型列的精度;
如果字符类型列、数值类型列中数据满足新的长度、精度,则可以缩小类型的长度、精度;
如果不改变字符串的长度,可以将 VARCHAR2类型和 CAHR
类型转换;
如果更改数据类型为另一种非同系列类型,则列中数据必须为
NULL。
Oracle 数据库基础教程2007
示例
ALTER TABLE employee MODIFY ename CHAR(20);
ALTER TABLE employee MODIFY phone NUMBER;
修改列名
语法
ALTER TABLE table_name RENAME COLUMN oldname
TO newname;
示例
ALTER TABLE employee RENAME COLUMN ename TO
employee_name;
Oracle 数据库基础教程2007
删除列
直接删除列语法
ALTER TABLE table_name
DROP [COLUMN
column_name]|[(column1_name,column2_name,… )]
[CASCADE CONSTRAINTS];
直接删除列示例
ALTER TABLE sc DROP COLUMN sno CASCADE
CONSTRAINTS;
ALTER TABLE employee DROP (phone,hiredate);
Oracle 数据库基础教程2007
将列标记为 UNUSED,然后进行删除。
ALTER TABLE table_name
SET UNUSED [COLUMN
column_name]|[(column1_name,column2_name,… )]
[CASCADE CONSTRAINTS];
示例
ALTER TABLE player SET UNUSED COLUMN sage;
ALTER TABLE player SET UNUSED (sname,resume);
ALTER TABLE player DROP UNUSED COLUMNS;
Oracle 数据库基础教程2007
表参数修改
可以对表的参数进行修改,包括存储参数、存储位置、
数据块设置等。
ALTER TABLE employee
PCTFREE 30 PCTUSED 60 STORAGE(NEXT 512K
PCTINCREASE 10);
注意:表创建后不能对 INITIAL,MINEXTENTS
两个参数进行修改。
Oracle 数据库基础教程2007
表结构重组
将一个非分区的表移动到一个新的数据段中,或者移动到其他的表空间中,通过这种操作可以重建表的存储结构,称为表结构重组。
语法
ALTER TABLE tbname MOVE [TABLESPACE tbs_name]
注意
直到表被完全移动到新的数据段中之后,Oracle才会删除原来的数据段;
表结构重组后,表中每个记录的 ROWID会发生变化,因此该表的所有索引失效,需要重新建立索引;
如果表中包含 LOB列,则默认情况下不移动 LOB列数据和 LOB
索引段。
Oracle 数据库基础教程2007
表重命名
语法
ALTER TABLE table_old_name RENAME TO
table_new_name;
RENAME table_old_name TO table_new_name;
说明
Oracle自动更新相应的约束、索引和与此表相关的权限;
同时以此表为参考的视图、同义词、存储过程和函数为非法。
Oracle 数据库基础教程2007
为表添加注释
语法
COMMENT ON TALBE table_name IS… ;
为列添加注释
语法
COMMENT ON COLUMN table_name.column_name IS…
注释可以通过以下数据字典来查看,
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.2.5删除表
使用 DELETE语句删减表
使用 TRUNCATE语句删减表
TRUNCATE TABLE EMP [REUSE STORAGE]
使用 DROP语句删除表
DROP TABLE EMP [CASCADE CONSTRAINTS]
DELETE,TRUNCATE,DROP 区别
Oracle 数据库基础教程2007
删除一个表同时,Oracle将执行下列操作:
删除该表中所有记录;
从数据字典中删除该表定义;
删除与该表相关的所有索引和触发器;
回收为该表分配的存储空间;
依赖于该表的数据库对象处于 INVALID状态。
Oracle 数据库基础教程2007
10.2.6利用 OEM管理表
创建表
删除表
修改表
查询表
Oracle 数据库基础教程2007
10.3索引
索引概述
索引管理
利用 OEM管理索引
Oracle 数据库基础教程2007
10.3.1索引概述
索引概念及作用
索引是为了加速对表中元组的检索而创建的一种分散存储结构;
是对表而建立的,由除存放表的数据页面以外的索引页面组成,独立于被索引的表;
通过使用索引加速行的检索,但减慢更新的速度;
快速定位数据,减少磁盘 I/O;
Oracle自动使用、维护索引
Oracle 数据库基础教程2007
索引分类
惟一性索引与非惟一性索引
平衡树索引与位图索引
单列索引与复合索引
函数索引
聚簇索引
全局索引与本地索引
Oracle 数据库基础教程2007
索引使用原则
导入数据后再创建索引
在适当的表和字段上创建索引
经常查询的记录数目少于表中所有记录总数的 5%;
经常进行连接查询表,在连接列上建立索引能够显著提高查询的速度;
对于取值范围很大的列应当创建 B树索引;
对于取值范围很小的列应当创建位图索引
不能在 LONG,LONG RAW,LOB数据类型的列上创建索引;
Oracle会自动在 PRIMARY KEY和 UNIQUE约束的列上创建惟一性索引。
合理设置复合索引中的字段顺序
Oracle 数据库基础教程2007
限制表中索引的数目
表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。
为索引设置合适的 PCTFREE参数
选择存储索引的表空间
默认情况下,索引与表存储在同一表空间中。索引与表存储在同一表空间中,有利于数据库维护操作,具有较高的可用性;
反之,若索引与表存储在不同的表空间中,则可提高系统的存取性能,减少硬盘 I/O冲突,但是表与索引可用状态可能出现不一致,如一个处于联机状态,另一个处于脱机状态。
Oracle 数据库基础教程2007
10.3.2管理索引
创建索引
修改索引
删除索引
索引的查询
Oracle 数据库基础教程2007
语法
CREATE [UNIQUE]|[BITMAP] INDEX index_name
ON table_name([column_name[ASC|DESC],… ]|
[expression])
[REVERSE]
[parameter_list];
说明
UNIQUE表示建立惟一性索引;
BITMAP表示建立位图索引;
ASC/DESC用于指定索引值的排列顺序,ASC表示按升序排序,
DESC表示按降序排序,缺省值为 ASC;
REVERSE表示建立反键索引;
parameter_list用于指定索引的存放位置、存储空间分配和数据块参数设置。
创建索引
Oracle 数据库基础教程2007
创建非惟一性索引
CREATE INDEX employee_ename ON
employee(ename)TABLESPACE users STORAGE
(INITIAL 20K NEXT 20k PCTINCREASE 75);
创建惟一性索引
CREATE UNIQUE INDEX deptartment_index ON
department(dname);
创建位图索引
CREATE BITMAP INDEX student_sex ON
student(sex);创建反序索引
创建反序索引
CREATE INDEX player_sage ON player(sage)
REVERSE;
Oracle 数据库基础教程2007
创建函数索引
CREATE INDEX idx ON
employee(UPPER(ename));
定义约束时创建索引
CREATE TABLE new_employee(
empno NUMBER(5) PRIMARY KEY USING
INDEX TABLESPACE users PCTFREE 0,
ename VARCHAR2(20)
);
Oracle 数据库基础教程2007
修改索引
修改索引的存储参数
ALTER INDEX employee_ename STORAGE
(PCTINCREASE 50);
合并索引
ALTER INDEX… COALESCE
ALTER INDEX employee_ename COALESCE;
Oracle 数据库基础教程2007
重建索引
ALTER INDEX… REBUILDER
ALTER INDEX player_sage REBUILD;
合并索引与重建索引比较合 并 索 引 重 建 索 引不能将索引移到其他表空间中 可以将索引移到其他表空间中代价较低,不需要使用额外的存储空间 代价较高,需要使用额外的存储空间只能在 B树的同一子树中进行合并,不会改变树的高度重建整个 B 树,可能会降低树的高度可以快速释放叶子节点中未使用的存储空间可以快速更改索引的存储参数。在重建过程中如果指定了 ONLINE关键字,
不会影响对当前索引的使用
Oracle 数据库基础教程2007
监视索引
ALTER INDEX … MONITORING USAGE
ALTER INDEX employee_ename
MONITORING USAGE;
ALTER INDEX employee_ename
NOMONITORING USAGE;
索引重命名
ALTER INDEX… RENAME TO …
ALTER INDEX employee_ename RENAME
TO employee_new_ename;
Oracle 数据库基础教程2007
删除索引
语法
DROP INDEX index_name;
在下面几种情况下,可以考虑删除索引
该索引不再使用。
通过一段时间监视,发现几乎没有查询或只有极少数查询会使用该索引。
由于索引中包含损坏的数据块或包含过多的存储碎片等,需要删除该索引,然后重建索引。
由于移动了表数据而导致索引失效
Oracle 数据库基础教程2007
索引的查询
DBA_INDEXES,ALL_INDEXES,USER_INDEXES
包含索引的基本描述信息和统计信息,包括索引的所有者、索引的名称、
索引的类型、对应表的名称、索引的存储参数设置、由分析得到的统计信息等信息
DBA_IND_COLUMNS,ALL_IND_COLUMNS、
USER_IND_COLUMNS
包含索引列的描述信息,包括索引的名称、表的名称和索引列的名称等信息
DBA_IND_EXPRESSIONS,ALL_IND_EXPRESSIONS、
USER_IND_EXPRESSIONS
包含函数索引的描述信息,通过该视图可以查看到函数索引的函数或表达式
V$OBJECT_USAGE
包含通过 ALTER INDEX… MONITORING USAGE语句对索引进行监视后得到的索引使用信息。
Oracle 数据库基础教程2007
10.3.3利用 OEM管理索引
创建索引
修改索引
删除索引
查询索引
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.4索引化表
索引化表概念
创建索引化表
设置溢出存储
修改索引化表
利用 OEM管理索引化表
Oracle 数据库基础教程2007
索引化表概念
索引化表( Index-Organized Table,IOT)是一种特殊的表,它按 B树的索引结构来组织和存储数据,将表的数据和索引的数据存储在一起。
主要适合于经常通过主键查询整个记录或部分记录的情况,表中记录的存放顺序与主键的顺序一致。
索引化表类似于 B树结构,不过索引条目不是标准 B树结构中索引值与 ROWID这样的结构,而是主键列与非主键列形式的结构。
Oracle 数据库基础教程2007
10.4.1创建索引化表
说明
在 CREATE TABLE语句中指定 ORGANIZATION INDEX关键字
必须建立一个 PRIMARY KEY 约束
示例
CREATE TABLE new_student(
sno NUMBER PRIMARY KEY,
sname CHAR(10),
sage NUMBER,
sex CHAR(2))
ORGANIZATION INDEX
TABLESPACE USERS ;
Oracle 数据库基础教程2007
可以通过子查询创建索引化表
CREATE TABLE new_emp(
empno PRIMARY KEY,ename)
ORGANIZATION INDEX
AS SELECT empno,ename FROM emp;
注意
利用子查询创建索引化表时,必须指定主键列和其他所有列,指定的列的个数必须与查询语句中目标列个数一致。
Oracle 数据库基础教程2007
10.4.2设置溢出存储
所谓的溢出存储是指将索引化表中每个记录分成两部分,其中一部分(包含主键列)保存在索引化表自身中(以索引的树状结构存储,称为索引条目部分),而另一部分保存在溢出表空间中
(以标准表的堆结构存储,称为溢出部分)。
若要启用溢出存储功能,必须在创建索引化表时指定 OVERFLOW子句指定溢出部分的存储空间,
同时使用 PCTTHRESHOLD子句或 INCLUDING
子句来设置溢出方式。
Oracle 数据库基础教程2007
用 PCTTHRESHOLD设置溢出存储
示例
CREATE TABLE iot_pct(
ID NUMBER PRIMARY KEY,
col1 VARCHAR2(20),
col2 VARCHAR2(10),
col3 NUMBER)
ORGANIZATION INDEX
TABLESPACE USERS
PCTTHRESHOLD 30 OVERFLOW
ABLESPACE ORCLTBS1;
Oracle 数据库基础教程2007
使用 PCTTHRESHOLD子句设置溢出比例时注意:
溢出存储是以列为单位,一个列要么全部保留在索引条目中,
要么全部溢出;
列的顺序主要取决于创建表时的列的定义顺序,但是 Oracle
会自动将主键列移动到非主键列的前面,保证主键列保存在索引条目中;
PCTTHRESHOLD子句所指定的比例必须包含索引化表中所有主键列。
Oracle 数据库基础教程2007
用 INCLUDING设置溢出存储
示例
CREATE TABLE iot_pct_include(
ID NUMBER PRIMARY KEY,
col1 VARCHAR2(20),
col2 VARCHAR2(10),
col3 NUMBER)
ORGANIZATION INDEX
TABLESPACE USERS
PCTTHRESHOLD 30
INCLUDING col3
OVERFLOW TABLESPACE ORCLTBS1;
Oracle 数据库基础教程2007
10.4.3修改索引化表
修改索引数据段与溢出数据段
重建索引化表
将索引化表转换为普通表
Oracle 数据库基础教程2007
修改索引数据段与溢出数据段
使用 ALTER TABLE语句可以对索引化表中索引数据段和溢出数据段进行修改,包括存储参数和溢出方式的修改。其中
OVERFLOW关键字之前的参数都是针对索引条目数据段的,
而 OVERFLOW之后的参数都是针对溢出数据段的。
ALTER TABLE new_student INITRANS 4 OVERFLOW
INITRANS 6;
ALTER TABLE iot_pct_includ PCTTHRESHOLD 15
INCLUDING col2;
如果原来的索引化表中没有使用溢出存储功能,可以通过
ALTER TABLE… ADD OVERFLOW为它应用溢出存储功能。
ALTER TABLE student ADD OVERFLOW TABLESPACE
ORCLTBS2
Oracle 数据库基础教程2007
重建索引化表
在不断对索引化表进行更新操作之后,将在索引化表中产生许多不连续的存储碎片,降低索引化表的查询效率。可以使用 ALTER TABLE… MOVE语句重建索引化表,以消除其中的存储碎片。
重建索引化表可以在原来的表空间中进行,也可以在新的表空间中进行。
ALTER TABLE new_student MOVE INITRANS 10;
ALTER TABLE iot_pct_include MOVE TABLESPACE
ORCLTBS2OVERFLOW TABLESPACE ORCLTBS3
Oracle 数据库基础教程2007
将索引化表转换为标准表
使用 Oracle中的 EMPORT和 IMPORT工具,将索引化表中的数据全部导出,然后再重新导入到一个标准表中。
使用 CREATE TABLE… AS SELECT语句,通过对索引化表的查询来创建一个标准表。
Oracle 数据库基础教程2007
10.4.4利用 OEM管理索引化表
创建索引化表
索引化表的其他管理
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.5分区表与分区索引
分区概述
创建分区表
创建分区索引
维护分区表与分区索引
Oracle 数据库基础教程2007
分区概述
分区概念
所谓的分区是指将一个巨型表或巨型索引分成若干独立的组成部分进行存储和管理,每一个相对小的、
可以独立管理的部分,称为原来表或索引的分区。
每个分区都具有相同的逻辑属性,但物理属性可以不同。如具有相同列、数据类型、约束等,但可以具有不同的存储参数、位于不同的表空间等。
分区后,表中每个记录或索引条目根据分区条件分散存储到不同分区中 。
Oracle 数据库基础教程2007
分区条件
表的大小超过 2GB
要对一个表进行并行 DML操作,必须分区
为了平衡硬盘的 I/O操作,将一个表分散存储在不同的表空间中,必须对它进行分区
如果需要将表一部分设置为只读,另一部分为可更新的,必须对表进行分区
Oracle 数据库基础教程2007
10.5.1创建分区表
分区方法
范围分区
列表分区
散列分区
复合分区
Oracle 数据库基础教程2007
范围分区
参数
PARTITION BY RANGE(col1,… )
PARTITION partion_name
VALUE LESS THAN
示例
,创建一个分区表,将学生信息根据其出生日期不同进行分区,将 1980年 1月 1日前出生的学生信息保存在
ORCLTBS1表空间中,1980年 1月 1日到 1990年 1月 1日出生的学生信息保存在 ORCLTBS2表空间中,其他学生信息保存在 ORCLTBS3表空间中。
Oracle 数据库基础教程2007
CREATE TABLE student_range(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sage int,
birthday DATE
)
PARTITION BY RANGE(birthday)
(PARTITION p1 VALUES LESS THAN
(TO_DATE('1980-1-1','YYYY-MM-DD')) TABLESPACE
ORCLTBS1,
PARTITION p2 VALUES LESS THAN
(TO_DATE('1990-1-1','YYYY-MM-DD')) TABLESPACE
ORCLTBS2,
PARTITION p3 VALUES LESS THAN(MAXVALUE)
TABLESPACE ORCLTBS3 STORAGE(INITIAL 10M NEXT 20M))
STORAGE(INITIAL 20M NEXT 10M MAXEXTENTS 10
);
Oracle 数据库基础教程2007
列表分区
参数
PARTITION BY LIST(col1,… )
PARTITION partition_name
VALUE
示例
创建一个分区表,将学生信息按性别不同进行分区,男学生信息保存在表空间 ORCLTBS1中,而女学生信息保存在
ORCLTBS2中 。
Oracle 数据库基础教程2007
CREATE TABLE student_list(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sex CHAR(2) CHECK(sex in ('M','F'))
)
PARTITION BY LIST(sex)
(PARTITION student_male VALUES('M') TABLESPACE
ORCLTBS1,
PARTITION student_female VALUES('F') TABLESPACE
ORCLTBS2)
STORAGE (INITIAL 10M NEXT 10M MAXEXTENTS 5
);
Oracle 数据库基础教程2007
散列分区
参数
PARITITION BY HASH( col1,… )
使用 PARTITION指定分区数量及 STORE IN指定分区存储空间;或使用 PARTITON指定每个分区名称以及其存储空间。
示例
创建一个分区表,根据学号将学生信息均匀分布到
ORCLTBS1和 ORCLTBS2两个表空间中 。
创建分区表
Oracle 数据库基础教程2007
CREATE TABLE student_hash (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10)
)
PARTITION BY HASH(sno)
(PARTITION p1 TABLESPACE ORCLTBS1,
PARTITION p2 TABLESPACE ORCLTBS2);
CREATE TABLE student_hash2 (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10) )
PARTITION BY HASH(sno)
PARTITIONS 2 STORE IN(ORCLTBS1,ORCLTBS2);
Oracle 数据库基础教程2007
复合分区
参数
PARTITION BY RANGE(col1,… )
SUBPARTITION BY HASH(col1,… )
每个子分区的子分区数量或子分区的描述。
示例
创建一个复合分区表,将 1980年 1月 1日前出生的学生信息均匀保存在 ORCLTBS1和 ORCLTBS2表空间中,1980年 1月 1
日到 1990年 1月 1日出生的学生信息保存在 ORCLTBS3和
ORCLTBS4表空间中,其他学生信息保存在 ORCLTBS5表空间中 。
Oracle 数据库基础教程2007
CREATE TABLE student_composition(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sage NUMBER(4),
birthday DATE
)
PARTITION BY RANGE(birthday)
SUBPARTITION BY HASH(sage)
(PARTITION p1 VALUES LESS THAN(TO_DATE('1980-1-1','YYYY-MM-DD'))
(SUBPARTITION p1_sub1 TABLESPACE ORCLTBS1,
SUBPARTITION p1_sub2 TABLESPACE ORCLTBS2),
PARTITION p2 VALUES LESS THAN(TO_DATE('1990-1-1','YYYY-MM-
DD'))
(SUBPARTITION p2_sub1 TABLESPACE ORCLTBS3,
SUBPARTITION p2_sub2 TABLESPACE ORCLTBS4),
PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE
ORCLTBS5
);
Oracle 数据库基础教程2007
四种分区方法的比较
Oracle 数据库基础教程2007
10.5.2创建分区索引
分区索引类型
创建分区索引
Oracle 数据库基础教程2007
分区索引类型
本地分区索引
本地分区索引是指为分区表中的各个分区单独建立索引分区,
各个索引分区之间是相互独立的。
全局分区索引
全局分区索引是指先对整个分区表建立索引,然后再对索引进行分区。
全局非分区索引
全局非分区索引是指对整个分区表创建标准的未分区的索引。
Oracle 数据库基础教程2007
创建本地分区索引
分区表创建后,可以对分区表创建本地分区索引。在指明分区方法时使用 LOCAL关键字标识本地分区索引。
CREATE INDEX student_range_local ON
student_range(sname) LOCAL;
创建全局分区索引
索引分区方法也包括范围分区、列表分区、散列分区和复合分区 4
种。在指明分区方法时使用 GLOBAL关键字标识全局分区索引。
CREATE INDEX student_range_global ON
student_range(sage)
GLOBAL PARTITION BY RANGE(sage)
(PARTITION p1 VALUES LESS THAN (80)
TABLESPACE ORCLTBS1,
PARTITION p2 VALUES LESS THAN (MAXVALUE)
TABLESPACE ORCLTBS2
);
Oracle 数据库基础教程2007
全局非分区索引
为分区表创建全局非分区索引与为标准表创建索引一样。例如,为分区表 student_list_index创建全局非分区索引,语句为:
CREATE INDEX student_list_index ON
student_list(sname);
Oracle 数据库基础教程2007
10.5.3维护分区表与分区索引
使用 ALTER TABLE语句来维护分区表,包括增加分区、合并分区、删除分区、交换分区、融合分区、修改分区增加值、修改分区删除值、移动分区、更名分区、分割分区、舍弃分区等。
ALTER TABLE student_hash ADD
PARTITION p3 TABLESPACE ORCLTBS3;
ALTER TABLE student_range MERGE
PARTITIONS p1,p2 INTO PARTITION p1;
Oracle 数据库基础教程2007
10.6其他模式对象
簇
视图
序列
同义词
数据库链接
Oracle 数据库基础教程2007
10.6.1簇
簇的概念
创建簇
创建聚簇表
修改簇
创建聚簇索引
删除簇
查询簇信息
利用 OEM管理簇
Oracle 数据库基础教程2007
簇的概念
簇是一种存储表数据的方法,一个簇由共享相同数据块的一组表组成。
在一个簇中,Oracle将多个表中具有相同相关列的记录聚簇在相同的数据块中(类似于连接结果)。
对于经常需要访问这些列的应用来说,能够减少硬盘
I/O时间、改善连接查询的效率。
Oracle 数据库基础教程2007
创建簇
在数据库中,簇占据实际的存储空间,因此用户必须具有足够的表空间配额。
CREATE CLUSTER student_class (class_id
NUMBER(3))
SIZE 600
TABLESPACE users
STORAGE (INITIAL 200K NEXT 300K
MINEXTENTS 2 MAXEXTENTS 20);
Oracle 数据库基础教程2007
创建聚簇表
通过将两个或多个聚簇表保存在同一个簇中,可以将两个表中具有相同的聚簇字段值的记录集中存放在同一个数据块(或相邻的多个数据块)中。
CREATE TABLE classes(
class_id NUMBER(3) PRIMARY KEY,
cname VARCHAR2(10) )
CLUSTER student_class (class_id);
CREATE TABLE students (
sno NUMBER(5) PRIMARY KEY,
sname VARCHAR2(15) NOT NULL,
class_id NUMBER(3) REFERENCES classes)
CLUSTER student_class(class_id);
注意:聚簇表中的聚簇字段必须与创建簇时指定的聚簇字段具有相同的名称和数据类型。
Oracle 数据库基础教程2007
修改簇
簇创建之后,用户可以对簇进行修改,包括:修改簇的物理存储参数( PCTFREE,PCTUSED,
STORAGE等)、修改 SIZE值的大小。
ALTER CLUSTER student_class PCTFREE
30 PCTUSED 60;
注意:不能修改聚簇表的 PCTFREE,PCTUSED、
INITRANS和 MAXTRANS参数。这些参数是由簇的物理存储参数设置的。
Oracle 数据库基础教程2007
创建聚簇索引
可以为簇中的聚族字段创建索引,这种类型的索引称为,聚簇索引,。
聚簇索引必须在向簇中的聚簇表中插入任何记录之前创建。
聚簇表中数据的存储顺序与聚簇索引中索引值排序相一致。
CREATE INDEX student_class_index
ON CLUSTER student_class
TABLESPACE USERS
STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 2
MAXEXTENTS 10) PCTFREE 10;
Oracle 数据库基础教程2007
根据簇中是否包含表,簇删除可以分为下列 3中情况。
使用 DROP CLUSTER删除不包含聚簇表的簇及簇索引。
DROP CLUSTER student_class;
使用 DROP CLUSTER...INCLUDING TABLES语句删除包含聚簇表的簇。
DROP CLUSTER student_class INCLUDING TABLES;
如果聚簇表中包含其他表外键参考的主键约束列或惟一性约束列,
则需要使用 CASCADE CONSTRAINTS子句删除约束同时删除簇。
DROP CLUSTER student_class INCLUDING TABLES
CASCADE CONSTRAINTS;
Oracle 数据库基础教程2007
查询簇信息
DBA_CLUSTERS:包含数据库中所有簇的信息。
ALL_CLUSTERS:包含当前用户可以访问的簇的信息。
US ER_CLUSTERS:包含当前用户的所有簇的信息。
DBA_CLU_COLUMNS:包含数据库中所有聚簇列信息。
USER_CLU_COLUMNS:包含当前用户所有聚簇列信息。
Oracle 数据库基础教程2007
利用 OEM管理簇
创建簇
删除簇
修改簇
查询簇
Oracle 数据库基础教程2007
Oracle 数据库基础教程2007
10.6.2视图
视图概念及作用
创建视图
视图操作
修改视图
删除视图
利用 OEM管理视图
Oracle 数据库基础教程2007
视图概念及作用
视图是从一个或多个表或视图中提取出来的数据的一种表现形式。在数据库中只有视图的定义,而没有实际对应,表,的存在,因此视图是一个,虚,表。当对视图进行操作时,系统根据视图定义临时生成数据。
通过视图的使用可以提高数据安全性、隐藏数据的复杂性、简化查询语句、分离应用程序与基础表、保存复杂查询等。
Oracle 数据库基础教程2007
创建视图
语法
CREATE OR REPLACE VIEW [schema.]view_name
[(column1,column2,… )]
AS subquery
[WITH READ ONLY]|[WITH CHECK
OPTION][CONSTRIANT constraint];
说明
Subquery为子查询,决定了视图中数据的来源;
WITH READ ONLY指明该视图为只读视图,不能修改;
WITH CHECK OPTION指明在使用视图时,检查数据是否符合子查询中的约束条件;
CONSTRAINT constraint为使用 WITH CHECK OPTION选项时指定的约束命名
Oracle 数据库基础教程2007
CREATE VIEW emp_info_view(deptno,avgsal,empcount)
AS
SELECT deptno,avg(sal),count(*) FROM emp
GROUP BY deptno;
CREATE VIEW emp_sal_view
AS
SELECT * FROM emp WHERE sal>2000
WITH CHECK OPTION;
CREATE VIEW emp_dept_view
AS
SELECT empno,ename,dname FROM emp,dept
WHERE emp.deptno=dept.deptno
Oracle 数据库基础教程2007
视图操作
视图创建后,就可以对视图进行操作,包括数据查询,DML操作
(数据的插入、删除、修改)等。因为视图是,虚表,,因此对视图的操作最终转换为对基本表的操作。
对视图的查询象对标准表查询一样,但是对视图执行 DML操作时需要注意,如果视图定义包括下列任何一项,则不可直接对视图进行插入、删除和修改等操作,需要通过触发器来实现。
集合操作符 ( UNION,UNION ALL,MINUS,INTERSECT)。
聚集函数( SUM,AVG等)。
GROUP BY,CONNECT BY,或 START WITH子句。
DISTINCT操作符。
(部分)连接操作。
Oracle 数据库基础教程2007
修改视图
可以采用 CREATE OR REPLACE VIEW 语句修改视图,实质是删除原视图并重建该视图,但是会保留该视图上授予的各种权限。
CREATE OR REPLACE VIEW
emp_dept_view
AS
SELECT empno,ename,sal,dname FROM
emp,dept WHERE
emp.deptno=dept.deptno;
Oracle 数据库基础教程2007
删除视图
可以使用 DROP VIEW语句删除视图。删除视图后,
该视图的定义从数据字典中删除,同时该视图上的权限被回收,但是对数据库表没有任何影响。
DROP VIEW emp_dept_view;
Oracle 数据库基础教程2007
利用 OEM管理视图
视图的创建、查看、修改和删除等。
Oracle 数据库基础教程2007
10.6.3序列
序列的概念
创建序列
使用序列
修改序列
删除序列
利用 OEM管理序列
Oracle 数据库基础教程2007
序列的概念
序列用于产生惟一序号的数据库对象,用于为多个数据库用户依次生成不重复的连续整数。
通常使用序列自动生成表中的主键值。
序列产生的数字最大长度可达到 38位十进制数。
序列不占用实际的存储空间,在数据字典中只存储序列的定义描述。
Oracle 数据库基础教程2007
创建序列
语法
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
示例
CREATE SEQUENCE stud_sequence INCREMENT BY 1
START WITH 100 MAXVALUE 1000;
Oracle 数据库基础教程2007
参数说明
INCREMENT BY子句用于设置相邻两个元素之间的差值,即步长,默认值为 1;
START WITH子句用于设置序列初始值,默认值为 1;
MAXVALUE|NO MAXVALUE子句用于设置序列有无最大值,
默认为无;
MINVALUE|NOMINVALUE子句用于设置序列有无最小值,
默认为无;
CYCLE|NOCYCLE子句用于设置序列是否可以循环,默认为不可循环;
CACHE|NOCACHE子句用于设置是否在缓存中预先分配一定数量的数据值,以提高获取序列值的速度,默认为不缓存。
Oracle 数据库基础教程2007
使用序列
属性
CURRVAL:返回序列当前值。
NEXTVAL:返回当前序列值增加一个步长后的值。
注意
序列值可以应用于查询的选择列表,INSERT语句的
VALUES子句,UPDATE语句的 SET子句,但不能应用在
WHERE子句或 PL/SQL过程性语句中。
示例
INSERT INTO students(sno,sname)
VALUES(stud_sequence.nextval,'JOAN');
SELECT stud_sequence.currval FROM dual;
Oracle 数据库基础教程2007
修改序列
除了不能修改序列起始值外,可以对序列其他任何子句和参数进行修改。
修改结构只对已用使用序列生效。
ALTER SEQUENCE stud_sequence
INCREMENT BY 10
MAXVALUE 10000 CYCLE CACHE 20;
Oracle 数据库基础教程2007
删除序列
当一个序列不再需要时,可以使用 DROP
SEQUENCE语句删除序列。
DROP SEQUENCE stud_sequence;
Oracle 数据库基础教程2007
利用 OEM管理序列
包括序列的创建、查看、修改和删除等。
Oracle 数据库基础教程2007
10.6.4同义词
同义词概述
创建同义词
删除同义词
利用 OEM管理同义词
Oracle 数据库基础教程2007
同义词概述
同义词是数据库中表、索引、视图或其他模式对象的一个别名。利用同义词,一方面为数据库对象提供一定的安全性保证,例如可以隐藏对象的实际名称和所有者信息,或隐藏分布式数据库中远程对象的位置信息;另一个方面是简化对象访问。此外,当数据库对象改变时,只需要修改同义词而不需要修改应用程序。
同义词分为私有同义词和公有同义词两种。私有同义词只能被创建它的用户所拥有,该用户可以控制其他用户是否有权使用该同义词;公有同义词被用户组
PUBLIC拥有,数据库所有用户都可以使用公有同义词。
Oracle 数据库基础教程2007
创建同义词
语法
CREATE [PUBLIC] SYNONYM synonym_name FOR
object_name;
示例
CREATE PUBLIC SYNONYM scottemp FOR scott.emp;
利用同义词可以实现对数据库对象的操作
UPDATE scottemp SET ename='SFD‘
WHERE empno=7884;
Oracle 数据库基础教程2007
删除同义词
语法
DROP [PUBLIC] SYNONYM synonym_name;
示例
DROP PUBLIC SYNONYM scottemp;
Oracle 数据库基础教程2007
利用 OEM管理同义词
同义词的创建、查看和删除等。
Oracle 数据库基础教程2007
10.6.5数据库链接
概述
创建数据库链接
利用 OEM管理数据库链接
Oracle 数据库基础教程2007
数据库链接概述
数据库链接是在分布式数据库应用环境中的一个数据库与另一个数据库之间的通信途径,将远程数据库映射到本地。所有能够访问本地数据库链接的应用程序即可访问远程数据库中的模式对象。
当用户正在访问一个本地数据库同时,需要访问其他非本地数据库的数据时,就需要使用数据库链接。数据库链接分为私有和公有两种类型。
Oracle 数据库基础教程2007
创建数据库链接
语法
CREATE [PUBLIC] DATABASE LINK dlink
[CONNECT TO [CURRENT USER]|[user IDENTIFIED
BY password]]
USING connect_string ;
参数说明
CONNECT TO子句用于设置与远程数据库建立连接的方式;
CURRENT USER子句指明用当前数据库用户连接远程数据库;
user IDENTIFIED BY password用于设置连接远程数据库的用户名和口令;
USING connect_string用于指定远程数据库在本地的服务命名。
Oracle 数据库基础教程2007
假设远程数据库在本地的服务命名为
backup_database,建立一个到远程数据库的连接
CREATE DATABASE LINK example_backup
CONNECT TO scott IDENTIFIED BY tiger
USING 'backup_database' ;
可以利用数据库链接更新远程数据库上的 emp表。
例如,修改远程数据库中员工工资,语句为:
UPDATE emp@example_backup SET
sal=sal+100;
Oracle 数据库基础教程2007
利用 OEM管理数据库链接
包括数据库链接的创建、查看和删除等。
Oracle 数据库基础教程2007
小结
表及其管理
索引及其管理
索引化表及其管理
分区表和分区索引的管理
簇的管理
视图、序列、同义词、数据库链接的管理