表和视图

/*  表  */

用户只有同时具有适当的系统权限和表空间配额,才能够在表空间中创建表.

创建表(在自己的模式中)

如果表所处的表空间时extent management local autoallocate,只能在storage中指定 initial,next,minextents三个存储参数
如果表所处的表空间时extent management local uniform,不能为表指定任何storage子句
如果表所处的表空间时extent management dictionary,可以在表的storage子句指定任何参数

在create table语句的storage子句中可以设置6个存储参数:
initial/next/pctincrease/minextents/maxextents/buffer_pool

create table employees
(empno number(5) primary key,
 ename varchar2(15) not null,
 age number(2) check(age between 18 and 65)
 /* age number(2) check(age>=18 and age <=65) */
 job varchar2(10),
 hiredate date default (sysdate),
 sal number(7,2),
 deptno number(3) not null,
 constraint emp_deptno_fk references dept)
tablespace users
pctfree 20
pctused 40
storage
( initial 50k
  next 50k
  maxextents 10
  pctincrease 25);

创建表(在其它模式中)
create table hr.empolyees (....);

CACHE子句:
在创建表时默认将使用NOCACHE子句,但对于比较小的但是又会经常查询的表,可以在创建时指定CACHE子句,ORACLE会把它放到数据库缓存LRU列表中.

创建临时表
create global temporary table work_area(....) on commit delete rows;
create global temporary table work_area(....) on commit preserve rows;

on commit delete rows:事务级别,oracle将在每次提交事务时,删除临时表中所有记录
on commit preserve rows:会话级别,oracle将直到会话中止时才会删除临时表中所有记录

修改表

表在创建之后,有些属性是不能修改的,如在STORAGE子句中设置的initial和minextents参数都是不可修改的.

添加字段
alter table employees add (age number(2));

修改字段参数(被修改的列不能有数据)
alter table employees modify(age number(3))

修改字段名
alter table table_name rename column column1 to column2
仅在9i以上版本使用

删除一个字段
alter table employees drop column age
删除多个字段
alter table employees drop (age,sal)

将字段标记为不使用状态
alter table employees set unused(sal,comm)

删除不使用的字段
alter table employees drop unused (sal,comm)

修改表参数设置(表创建之后,不能对initial和minextents两个参数进行修改)
alter table employees
pctfree 30
pctused 60

alter table employees
  storage( next 512k
    pctincrease 0
    maxextents unlimited);

移动表到其它表空间(这种操作可以重建表的存储结构)
alter table employees move
tablespace users02
storage(initial 128k
        next 128k
        minextents 1
        pctincrease 0);

也可以将表移动到同一个表空间的新数据段中:
alter tabel employees move
storage (initial 20k
  ......);

回收表的空闲空间
alter table temp_employees deallocate unused;

删除表中所有记录
(在对包含有主码的表进行删减之前,必须首先禁用其它表中引用该主码的外部码的约束)
delete from employees;
truncate table employees;

删除表/所有的外部码约束
drop table employees;

如果在要删除的表中包含有被其它表的外部码引用的主码或唯一码,并且希望在删除这个表的同时也删除其它表中的相关的外部码约束,可以指定CASCADE子句
drop table employees cascade constraints

分析表
验证存储结构(用validate structure子句),检查是否有坏块,ORACLE会把表中包含有损坏数据块的记录的ROWID插入到INVALID_ROWS表中)
analyze table employees validate structure

(需要创建invalid_rows表:
SQL> @i:/oracle/ora90/rdbms/admin/utlvalid.sql;)

收集表的统计信息(可以通过查询user_table/all_table/dba_table数据字典来获取分析后的统计信息)
analyze table employees compute statistics(全表)
analyze table employees estimate statistics sample 200 rows(部分数据)
analyze table employees estimate statistics sample 20 percent(部分数据)

重命名表(注意要查询有哪些对象依赖于该表,因为这些对象将处于invalid状态)
rename employees to emp

表数据字典
all_tables/dba_tables/user_tables  表信息
all_tab_columns/dba_tab_columns/user_tab_columns  表/视图中字段信息
all_objects/dba_objects/user_objects 所有模式对象的信息,包括创建日期
all_extents/dba_extents/user_extents 表分配的区的信息(该区所属的表空间,包含块数,区的大小)


/*  视图  */

数据库中只保存视图的定义,视图不占用实际的存储空间

使用视图可以达到如下目的:
* 提供数据安全性保证
* 隐藏数据的复杂性
* 简化查询语句
* 分离应用程序和基础表
* 执行某些必须使用到视图的查询
* 保存复杂查询

可更新视图:
如果在连接视图的定义查询中不包含如下结构,则这样的连接视图是可更新的:
* 集合运算符(union,intersect,minus等)
* DISTINCT关键字
* GROUP BY,ORDER BY,CONNECT BY或START WITH子句
* 子查询
* 分组函数

可以对非连接视图和可更新的连接视图执行INSERT,UPDATE,DELETE操作,ORACLE会自动判断哪些视图可以更新,在数据字典视图ALL/DBA/USER_UPDATABLE_COLUMNS中记载着视图中哪些字段是可更新的.

对视图的访问权限取决于对视图的基础对象的访问权限,而且视图的所有者必须显示地获得对基础对象的访问权限,而不能通过角色来获得这些权限.

创建视图:
create view sales_staff as
 select empno,ename,deptno
 from emp
 where deptno = 10
with check option constraint sales_staff_cnst;

如果在创建视图时指定了WITH CHECK OPTION子句(实际上是创建了一个名为sales_staff_cnst的约束),在对视图进行INSERT或UPDATE操作时,不符合定义视图的子查询的记录将不被视图接纳,如:
insert into sales_staff values(7584,'OSTER‘,10) --成功
insert into sales_staff values(7591,'WILLIAMS’,30) --失败,因为DEPTNO字段值时30,不符合定义SALES_STAFF视图的子查询的要求

如果不希望通过视图来修改基础表的情况,可以指定WITH READ ONLY子句:
create view sales_staff as
 select empno,ename,deptno
 from emp
 where deptno = 10
with READ ONLY;

重定义视图(依赖于该视图的所有对象都将变为INVALID状态):
create or replace view sales_staff as
 select empno,ename,deptno
 from emp
 where deptno = 10
with check option constraint sales_staff_cnst;

删除视图:
drop view sales_staff;

视图数据字典:
all_views/dba_views/user_views 视图的描述信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值