初学者在学习数据库的建表语句的时候一般可能只了解一种建表语句,没有接触到其他方式的建表语句。
个人总结出一般我们建表是有四种建表方式,四种建表方式各有优点和缺点,我们慢慢说明。
第一种:一般情况建立表
在一般开发中建立表时采用的语句:
create table test.t_emp(
eid number(5),
ename varchar2(10),
hiredate date default trunc(sysdate),
sal number(7,2),
comm number(7,2) default 0.03);
这是最常用的建表方式,定义表名,每个字段以及字段的类型,大小,各种约束条件,主键等,依据语法定义。只要在设计上和语法上没有错误,就会创建一张相应的表。创建之后就可以对表进行插入数据等操作,在一般建立数据表时都采用的是这种方式。具体的语法这里就不在详细介绍了。
第二种:依据查询结果建立新表
create table t_emp_copy as(
select *from
test.t_emp
where 1=2);
这种方式是依据子查询出来的结果,将结果的数据结构作为新表的结构进行新表建立。并且将子查询的结果一次导入新建立的表中。
注意:所建的表虽然完全是之前表的副本,他们的定义和包含的行完全相同。列上的所有NOT NULL(非空)
和CHECK(检查)约束也应用到新的表,但所有的PRIMARY KEY,UNIQUE或者FOREIGN KEY约束则不适用
(因为这三类约束需要索引),所以在使用这种方式时要注意约束条件和序列是否符合你的新表,比如新表有主键,你使用这种创建表的方式后,就必须另写sql语句来添加主键约束,其他约束也是这样的。
优点:
1.在新建表的时候不需要详细的考虑每个字段的数据类型,长度。直接依据子查询结果得字段来进行字段的设计,这样节省了在写定义字段的语句。
2.在建立表结构的同时,会将子查询得到的数据导入新建的表中,不需要以后再插入大量的数据进去,节省时间。
缺点:
1.在新建的表的结构上和子查询得出的字段的字段结构是不完全相同的,只有字段的类型,长度一样。子查询得到的字段的约束是不会在新表中建立出来的,所以一旦要求新表的约束条件多了,这种方式建立出来的新表明显和你想要的表的结构有很大的差别,这时这种方法要慎用。
应用场景:比如在数据备份,比如在建立一个新的业务表,这张表的数据会有其他已经存在的表的数据,这时依据数据库原有数据建立新表就很方便了。
第三种:建立事务级的临时表
ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,
或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,
但是临时表的结构以及元数据还存储在用户的数据字典中。
临时表只在oracle8i以及以上产品中支持。
Oracle临时表分为会话级临时表 和 事务级临时表。
会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,
临时表不需要DML锁.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.
你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.
临时表可以拥有触发器.
session级的临时表,只有在truncate table、session结束才能释放对表的锁定,等所有session释放bounding临时表,才能drop临时表;否这会报ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引。
临时表需要drop才能去掉其定义。
临时表不产生redo、undo信息。
临时表各个session间的数据是不可见的,只能看到自己session的数据。
创建事务级临时表:
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT DELETE ROWS;
第四种:建立会话级的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT PRESERVE ROWS;
可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。
本文章只是建议性参考,个人经验,如有问题,请联系。