Oracle表的类型
heap table | 数据以堆的方式管理 |
index organized tables | 表按索引结构存储,强制要求行本身有某种物理顺序,数据要根据主键有序的存储 |
index clusters tables | cluster是指一个或多个表组成的组,这些表物理的存储在相同的数据库块上,有相同聚簇键值的所有行会相邻地物理存储; |
hash clusters tables | 这些表类似于聚簇表,但是不使用B树索引聚簇键来定位数据,散列聚簇将键散列到聚簇上,从而找到数据应该在哪个数据库块上; |
partitioned tables |
|
stored hash clustered table | 有序散列聚簇表是oracle10g中新增的,它结合了散列聚簇表的某些方面,同时兼有IOT的一些方面; |
nested table |
|
temporary table |
|
--建立一张表
CREATE TABLE emp
(empno NUMBER(4),--如果插入有小数,将会4舍5入
ename VARCHAR2(10),
hiredate DATE DEFAULT TRUNC(SYSDATE),
sal NUMBER(7,2),
comm NUMBER(7,2) DEFAULT 0.03
);
通过子查询创建表
--通过子查询创建表
CREATE TABLE emp_copyAS SELECT * FROM emp;
通过这种方式创建的表所有的非空约束和检查约束将存在,而主键,唯一键和外键约束将丢失;这是因为后面三种约束创建的同时需要索引;
还可以通过联合查询来创建新表
CREATE TABLE emp_deptAS SELECT
last_nameename,dapartment_name dname,ROUND(SYSDATE-hire_date) service
FROM employeesNATURAL JOIN departments ORDER BY dname,ename;
--只拷贝表结构,但是不插入原表中的数据
CREATE TABLE emp_strcAS SELECT * FROM employees WHERE 1=2;
改变表结构
--增加一列
ALTER TABLE empADD(job_id NUMBER);
--修改一列
ALTER TABLE empMODIFY (commission_pct NUMBER(4,2) DEFAULT 0.05);
--删除一列
ALTER TABLE emp DROPCOLUMN commission_pct
--使某一列失效
ALTER TABLE emp SETUNUSED COLUMN job_id;
--重命名列名
ALTER TABLE empRENAME COLUMN hire_date TO recruited;
--将某个表变为只读
ALTER TABLE emp READ ONLY;--DML操作会失败,但是删除表的操作依然 可以成功
--删除置为无效的列
ALTER TABLE tablenameDROP UNUSED COLUMNS;
--删除表
DROP TABLEtablename;--必须为空表,表没有依赖关系
--清空表的内容
TRUNCATE TABLEtablename;
创建和使用临时表
临时表对于所有的sessions都是可见的,但是其中的每一行都属于插入该行的session
--创建临时表
CREATE GLOBALTEMPORARY TABLE temp_tab_name
(COLUMN datatype,COLUMN datatype)
[ON COMMIT {DELETE |PRESERVE} ROWS];
在临时表上执行SQL操作要比在正式表上执行快,原因如下:
1、temporary tables are not segments inpermanent tablespaces;他们存在于每个session的PGA中;如果超出PGA的容量,会将数据转移到用户的临时表空间中,临时表空间的IO要快很多,原因是它不经过database buffer cache;它是通过会话服务器进程和磁盘之间进行的;
2、第二个块的原因是对于临时表的DML操作不会产生redo记录;