Oracle数据库(2)
在上一篇文章中出现的dual可能大家会有一些疑问,dual其实是Oracle提供的一个空的表,以便于大家查询数据
表空间是Oracle数据库中最大的逻辑部分。可以将表空间看作数据库对象的容器,它被划分为一个一个独立的段,存储着数据库的所有对象。 如果将数据库比为一个放资料的柜子,则柜子的抽屉就是我们的表空间,抽屉里面的文件夹就是我们的数据文件(,文件夹中的纸就是段,纸上的文字就是我们通常意义上的数据。属于不同应用的数据应当被放在不同的表空间中,就好像不同类别的资料需要放入不同的抽屉一样。数据库、表空间、数据文件之间的关系见下图
永久表空间
主要用于存放各种需要长期保存的数据文件,用户数据及数据字典临时表空间主要用来做查询和存放一些缓冲区数据
临时表空间
消耗的主要原因是需要对查询的中间结果进行排序。重启数据库后可以自动释放临时表空间。
创建表空间的基本语法格式:
CREATE TABLESPACE 表空间名称
DATAFILE ‘数据文件全名’
SIZE 数据文件初始长度;
例子:
System>CREATE TABLESPACE DATASPACE
DATAFILE'D:\Data01.DBF' SIZE 200M;
创建临时表空间的基本语法格式:
CREATETEMPORARYTABLESPACE 表空间名称
TEMPFILE ‘数据文件全名’
SIZE 数据文件初始长度;
例子:
CREATE TEMPORARY TABLESPACE temp_tbs
TEMPFILE 'd:/temp.dbf' SIZE 10m;
通过人工改变表空间的状态,可以控制表空间的可用性、安全性,并能为备份和恢复提供保证。表空间有联机和脱机两种状态。
联机状态
联机状态又分为以下两种情况:
读写
只读
脱机状态
在有多个应用表空间的数据库中,DBA可以将某个表空间设置为脱机状态,使该表空间暂时不允许任何用户访问它(用户仍可访问数据库中的其他表空间)。也可以将表空间从脱机状态切换到联机状态,使用户重新能够访问其中的数据。DBA可以将表空间的状态在联机与脱机之间转换。注意:SYSTEM表空间不能被设置为脱机状态,因为数据库运行过程中始终会用到SYSTEM表空间中的数据。
有四种脱机模式:
正常
(
NORMAL
)
临时
(
TEMPORARY
)
立即
(
IMMEDIATE
)
用于恢复
(
FORRECOVERY
)
将表空间联机的命令为: ALTER TABLESPACE 表空间名称 ONLINE;
将表空间脱机的命令为:ALTERTABLESPACE 表空间名称 OFFLINENORMAL;
查看表空间信息(sys身份登录)
SELECT * FROM
dba_tablespaces
;
或
SELECT * FROM
v$tablespace
;
或(当前账户)
SELECT * FROM
user_tablespaces
;
查看表空间的文件信息
SELECT * FROM
dba_data_files
WHERE
tablespace_name
=‘
表空间名称’
(
永久表空间
)
SELECT * FROM
dba_temp_files
;(
临时表空间
)
修改表空间的命令为
ALTER TABLESPACE 表空间名称 需修改的值;
以下语句将表空间DATASPACE改为只读或读写
ALTER TABLESPACE DATASPACE READ ONLY;
ALTER TABLESPACE DATASPACE READ WRITE;
DROPTABLESPACE 表空间名称;
以下语句将删除表空间DATASPACE示:
DROP TABLESPACE DATASPACE;
下面介绍几个Oracle和其他数据库的语法不同
在修改表的字段的时候Oracle的语法是
ALTER TABLE 表名
MODIFY [字段名称 数据类型],…
在Oracle中没有自增长这个约束!要实现自增长那么就需要添加序列
序列(sequence)就是一个命名的顺序编号生成器。它能够以串行方式生成一系列的顺序整数。序列可以被设置为递增或递减、有界或无界、循环或不循环等方式。序列比较象数学当中等差数列的概念,需要提供初始值和差值。
序列由Oracle服务器端产生,出自一处,可以在多用户并发环境中为各个用户生成不重复的顺序整数,而且不需要任何额外的I/O。每个用户在对序列提出申请时都会得到下一个可用的整数。
如果有多个用户同时向序列提出申请,序列将按照串行机制依次处理各个用户的请求,决不会生成两个相同的整数。序列生成下一个整数的速度十分快,即使在并发用户数量很多的联机事务处理环境中,当多个用户同时对序列提出申请时也不会产生明显的延迟。在定义序列时需要提供如下信息:
序列的名称
生成整数的顺序是递增还是递减
生成整数的界限或范围,是否循环
生成的两个整数之间的间隔(即等差数列中的差值)
CREATE SEQUENCE mySEQ //创建序列
[INCREMENT BY n][START WITH n]//每次增长的值 从哪个值开始
[MAXVALUE n|NOMAXVALUE]//最大值 没有最大值
[MINVALUE n|NOMINVALUE]//最小值 没有最小值
[CYCLE|NOCYCLE]//是否循环
[CACHE|NOCACHE]//设置不缓存序列内容
在Oracle中有一种方法可以直接将表删除-------截断表
截断表是指彻底删除表中的所有数据,并释放所占用的所有空间
使用DELETE操作可以删除表中的数据,但当使用事务回滚后,所删除的数据就会回滚,也就是说删除的数据资源并没有完全释放
截断表语法:TRUNCATE TABLE 表名称
DELETE语句也可以从表中删除所有的行,但它不能释放存储空间。TRUNCATE命令更快一些,用TRUNCATE语句删除行比用DELETE语句删除同样的行快一些,原因如下:
TRUNCATE语句是数据定义 (DDL)语句。并且不产生回滚信息。
截断一个表不触发表的删除触发器
如果表是一个引用完整性约束的父表,你不能截断该表
在这里必须介绍一下回滚了,大家在上一边文章中可能会有这样的疑问,当你提交数据后,但是只是在缓存中更新了表数据或者结构,而实际上没有改变,这是因为Oracle的客户端sqlplus和sql developer都需要提交数据才能真正执行;所谓的提交就是commit指令,而其余的Mysql ,sql server等客户端和java连接数据时用的DBUtil都是设置自动提交的,所有不会出现我们上述问题。而所谓的回滚就是roll back指令,将没有提交的数据回滚回起初状态!
提交与回滚统称为事物;
以上语句均可在sqlplus下执行,其中会有个别语句在可视化客户端不支持,大家不必计较!