目的:
增加约束
创建索引
使用CREATE TABLE语句创建索引
创建函数索引
删除列和将列置为UNUSED
平台FLASHBACK闪回操作
创建临时表
创建和使用外部表
ALTER TABLE语句
-增加列
-修改已存在的列
-定义列的默认值
-删除列
语法
ALTER TABLE table_name ADD (column datatype [DEFAULT expr] [,column datatype] . . .);
ALTER TABLE table_name MODIFY (column datatype [DEFAULT expr] [,column datatype] . . .);
ALTER TABLE table_name DROP (column);
ALTER TABLE table_name SET UNUSED column_name;
ALTER TABLE table_name DROP UNUSED COLUMNS;
ALTER TABLE table_name READ ONLY;
ALTER TABLE table_name READ WRITE;
增加列
-新增列不能指定列的显示位置。新列成为最后一列
注意:增加新列NOT NULL约束时,如果表中已有资料NOT NULL约束将失败。
修改列
-可以对列的数据类型、大小和默认值进行更改。
-满足以下条件,可以减少列的宽度
-该列仅包含空值
-空表
-减少的列宽不小于该列中的现有值
-如果该列子包含空值,则可以更改数据类型。char-to-varchar2有数据也可以转换。
-对列的默认值更改只会影响后续的插入。
删除列
-该列包含或不包含数据
-使用ALTER TABLE 语句,一次只能删除一列
-表格中必须至少保留一列
-列被删除后,无法恢复
-如果列是约束的一部分或者是索引键上的栏(测试主键和外键),则不能删除列,除非添加了cascade级联选项
-如果列上有大量的数据,删除列需要一些时间。这种情况下最好将其设置为UNUSED状态,并在系统上的用户较少时将其丢弃,以避免扩大锁定。
注意:某些列永远不能被删除,例如构成分区表分区键的列或构成索引组织表的主键一部分的列。
SET UNUSED
-SET UNUSED将一列或多列标记为未使用,以便在系统资源需求较低时可将其删除。它并不会从实际空间进行删除,因此响应时间比执行DROP子句更快。列被标记为未使用之后,将无权访问该列。
-SET UNUSED信息存储于USER_UNUSED_COL_TABS数据字典中。
注意:SET UNUSED的原则与DROP相似
约束
-可以增加、删除、启用/关闭约束,但不能改变其结构。
-增加NOT NULL约束,必须使用ALTER TABLE MODIFY语句。
注意:只能在空表的列上增加NOT NULL约束或者列上每一行都有值。
语法
ALTER TABLE <table_name > ADD [CONSTRAINT <constraint_name>] TYPE (<column_name>);
-ON DELETE CASCADE级联删除
允许子表引用的父键数据被删除,但不被更新。当父表中键值删除时,子表中依赖值的所有行也被删除。在FOREIGN KEY外键约束中指定ON DELELTE CASCADE选项。
-ON DELETE SET NULL级联置空
当父表中键值删除时,子表中依赖值置空。
延迟约束
-DEFERRABLE or NOT DEFERRABLE
-INITIALLY DEFERRED or INITIALLY IMMEDIATE
推迟约束检查,直达事务结束时才进行约束检查。如果违反约束,则整个事务将回滚。
ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> PRIMARY KEY (column_name) DEFERRABLE INITIALLY DEFERRED;
SET CONSTRAINTS <constraint_name> IMMEDIATE;
ALTER SESSION SET CONSTRAINTS=IMMEDIATE;
删除约束
ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;
ALTER TABLE <table_name> DROP PRIMARY KEY|UNIQUE (column) | CONSTRAINT <constraint_name> [CASCADE];
关闭约束
ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name> [CASCADE];
注意:关闭唯一性约束和主键约束时,相关的索引会进行删除。
启用约束
ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name> ;
注意:启用主键约束时,依赖此主键的外键约束不会级联启用。
级联约束
ALTER TABLE <table_name> DROP COLUMN <column_name> CASCADE CONSTRAINTS;->如果列上有引用使用cascade constraints选项可以级联删除列。
索引
索引类型:
唯一性索引:PRIMARY KEY和UNIQUE约束会自动创建唯一性索引。
非唯一性索引:用户自定义创建索引。CREATE INDEX/CREATE TABLE
注意:创建唯一性索引时,建议创建一个唯一性约束,因为它会隐式的创建一个唯一性索引。
重用Index
ALTER TABLE <table_name> ADD PRIMARY KEY (column_name) USING INDEX <index_name>;
基于函数的索引
-索引上是表达式可以是:列、约束、SQL 函数和用户自定义函数。
注意:使用函数索引必须将参数QUERY_REWRITE_ENABLED设定为TRUE
CREATE INDEX <index_name> ON table_name(UPPER(column_name));
select * from ocp_047_base_function where upper(col)=upper(‘name‘);
select * from table(dbms_xplan.display_cursor());
删除索引
DROP INDEX <index_name>;
删除表
DROP TABLE <table_name> [PURGE];
Oracle 10g引入了一个删除表的新功能。删除表时,数据库不会立即释放与该表关联的空间。而是将表重命名放入回收站中,如果发现错误地删除,则可以使用FLASHBACK TABLE语句恢复该表。如果想立即释放空间可以使用DROP TABLE [PRUGE]语句。
注意:SYS(AS SYSDBA)账户删除的表不会放入回收站中。
FLASHBACK TABLE闪回
FLASHBACK TABLE [schema .] table [, [schema.] table ...] TO { TIMESTAMP | SCN } expr [ { ENABLE | DISABLE} TRIGGERS];
-Oracle 10g提供的新特性DDL命令,FLASHBACK TABLE
-将表恢复到较早的时间点或防止意外删除和修改表
-FLASHBACK TABLE 是一种自助修复工具,用于恢复表中的数据以及索引或视图
-数据库联机时完成,只需回滚指定的表。
-与传统恢复机制相比,此功能提供了易用性、可用性和更快恢复等优势。
-默认情况下所有涉及的表都禁用触发器,也可以指定ENABLE TRIGGERS来启用。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP# BIN$X5JCv1b5JHDgU+sCHqzk8Q==$0 TABLE 2017-12-05:13:39:38
EMP$_# BIN$X5JCv1b+JHDgU+sCHqzk8Q==$0 TABLE 2017-12-05:13:40:12
EmP BIN$X5JCv1cDJHDgU+sCHqzk8Q==$0 TABLE 2017-12-05:13:40:21
INSERT_TAB BIN$X6NQR/0SAVbgU+sCHqzqQg==$0 TABLE 2017-12-06:10:39:32
INSERT_TAB BIN$X6NQR/0MAVbgU+sCHqzqQg==$0 TABLE 2017-12-06:10:20:06
SQL> desc recyclebin
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
SQL> select original_name,operation,droptime from recyclebin;
ORIGINAL_NAME OPERATION DROPTIME
-------------------------------- --------- -------------------
EMP# DROP 2017-12-05:13:39:38
EMP$_# DROP 2017-12-05:13:40:12
EmP DROP 2017-12-05:13:40:21
TAB_04 DROP 2017-12-06:10:00:19
T01 DROP 2017-12-20:17:11:48
INSERT_TAB DROP 2017-12-06:10:39:32
OCP_047_BASE_FUNCTION_V0 DROP 2017-12-20:17:05:53
OCP_047_BASE_FUNCTION DROP 2017-12-20:17:05:53
INSERT_TAB DROP 2017-12-06:10:20:06
闪回表
FLASHBACK TABLE <table_name> TO BEFORE DROP;
临时表
CREATE GLOBAL TEMPORARY TABLE <table_name> ON COMMIT [PRESERVE | DELETE ] ROWS;
-PRESERVE ROWS :保留至会话结束
-DELETE ROWS:保留至事务结束
14:17:38 SQL> create global temporary table temp_t0
14:18:23 2 on commit preserve rows as select * from employees where rownum<20;
已建立表格.
14:19:21 SQL> select count(*) from temp_t0;
COUNT(*)
----------
19
14:19:25 SQL> commit;
確認完成.
14:19:29 SQL> select count(*) from temp_t0;
COUNT(*)
----------
19
14:20:27 SQL> create global temporary table temp_t0 on commit
14:28:25 2 delete rows as select * from employees where rownum<20;
已建立表格.
14:28:44 SQL> select * from temp_t0;
沒有任何資料列被選取
14:28:51 SQL> select count(*) from temp_t0;
COUNT(*)
----------
0
14:29:06 SQL> insert into temp_t0 select * from employees;
已建立 107 個資料列.
14:29:23 SQL> select count(*) from temp_t0;
COUNT(*)
----------
107
14:29:33 SQL> commit;
確認完成.
14:29:36 SQL> select count(*) from temp_t0;
COUNT(*)
----------
0
14:29:37 SQL>
外部表
外部表是一个只读表,元数据存储在数据库中,但其数据存储在数据库之外。外部表可以被认为是一个视图,可以对外部数据进行SQL查询,而不需要将外部数据加载到数据库中。
外部表不能进行DML操作、建立索引。但可以使用CREATE TABLE AS SELECT加载数据到数据库中。
外部表提供了两个访问驱动程序:ORACLE_LOADER和ORACLE_DATAPUMP
-ORACLE_LOADER将外部数据映射到数据库
-ORACLE_DATAPUMP将数据库资料卸载到外部文件
外部表的创建
-创建目录提供给外部表 CREATE [OR REPLACE] DIRECTORY <directory_name> AS ‘directory_path‘;
-授权目录给使用账户 GRANT READ ON DIRECTORY <directory_name> TO schema_name;
ORACLE_DATAPUMP
CREATE TABLE extract_emps
ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY ...
ACCESS PARAMETERS (...)
LOCATION (...)
PARALLEL 4
REJECT LIMIT UNLIMITED
AS
SELECT * FROM ...;
create table extract_datapump
(last_name,employee_id,salary)
organization external
(type oracle_datapump
default directory expdp_path
location(‘emp_01.bat‘,‘emp_02.bat‘))
parallel
as
select last_name,employee_id,salary from employees
;
[oracle@xxxxx bak]$ strings emp_01.bat|tail
Perkins
Bell
Everett
ORACLE_LOADER
CREATE TABLE extract_loader ( --表名称
fname char(25), --字段名
lname char(25)) --字段名
ORGANIZATION EXTERNAL --外部表
(TYPE ORACLE_LOADER --外部表驱动器
DEFAULT DIRECTORY <directory_name> --默认目录
ACCESS PARAMETERS --标识访问参数
(RECORDS DELIMITED BY NEWLINE
NOBADFILE --不产生故障文件
NOLOGFILE --不产生日志文件
FIELDS TERMINATED BY ‘,‘ --区分符
(fname POSITION (1:20) CHAR, --定义文件类型对应值
lname POSITION (22:41) CHAR))
LOCATION (‘file_name‘))--加载文件名称
PARALLEL 5 --并行度
REJECT LIMIT 200; --限制错误的个数及停止查询
外部表创建语法
CREATE TABLE <table_name>
(<col_name> <datatype>, ... )
ORGANIZATION EXTERNAL
(TYPE <access_driver_type>
DEFAULT DIRECTORY <directory_name>
ACCESS PARAMETERS
( ... ) )
LOCATION (‘<localtion_specifier>‘) )
REJECT LIMIT [ 0 | <number> | UNLIMITED];