Oracle中巧用CTAS快速建立表格

CTAS是通过查询,然后按照查询的结果来成立表格的一种行动。显然通过这种行动可以省去界说表结构的行动 ,并且在创建 表的同时导入数据。不外在应用这个行动 的时间,如故有些内容必要 引起数据库管理 员的留意。(SQL Server数据库中成批导入数据的几个常用行动 )

CTAS
     Create table 新表名 as select 字段名 from 旧表名;
     //拷贝旧表的结构和记实,不拷贝约束

  

  如上图,就是笔者操作CTAS成立表格的过程。此中 AD_USER是原表,而AD_USER_CTAS是操作CTAS行动 成立的表。操作DESC查察 两个表的结构,人人可以创造起不是大略 的表复制罢了。

  一、可以批改列名和字段的数据范例。

  大部分 时间,在创建 表(SQL 2008中独霸哀求 重新创建 表的变动)时数据库管理 员也许不渴望 照搬照抄起因的表格,而总渴望 可以或许变动某些内容。如列的名字可能数据范例等等。在应用 CTAS行动 来创建 表的时间,是可以做到在肯定 范畴之内对原有的内容举办变动。不外必要 留意的是,笔者这里说的是在肯定 范畴之内可以对原有的内容举办变动,而不是整个内容。即其可以变动的内容是有限的。

  一样平常来说,在操作CTAS行动 创建 表格时,可以变动方针列的列名。如上图所示,可以直接在Select查询语句中应用别名 ,来重界说方针列的名字。然后再操作CTAS来创建 表格的时间,就会以方针列的别名 来定名新的字段名称。其它必要 留意的是,固然可以批改数据范例,但是其批改必要 受到严肃的限定。如上图所示,在SELECT查询语句中,可以操作数据范例转换函数对方针数据范例举办转换,然后在新成立的表格中,就会以方针列的数据范例来界说新列的数据范例。也就是说,假如必要 变动某个列的数据范例的话,则必需在SELECT查询语句中通过数据范例的转换函数来实现。而不可以或许通过其他行动 来调度 数据范例。除非是表格成立好之后,再在成立好的表格中举办变动。

  二、约束条件不肯定 会继承 。

  操作CTAS成立表格时,原有的约束条件是否会被继承 下来呢?再有些参考书上说,约束条件是不会被生涯的。不外按照笔者对ORACLE数据库的了解 ,感觉这个说法太过于绝对。着实 并不是全部的约束条件都不会被继承 。正好相反,一样平常情况下都市被新表所继承 ,而只有在一些出格的情况下才不会被生涯。

  如上图所示,在原表中有一个字段叫做VALUE。在创建 这个表的时间笔者给其加了一个“非空”的约束条件。操作CTAS创建 新表之后,人人可以看到新表中也有一个字段VALUE,并且这个字段的约束条件也黑白空的。可见,操作CTAS创建 新表的时间,原表中的非空约束照样生涯下来了。不外这个继承 是有条件的,只有在不对原表中的数据范例举办变动的情况下,手法够生涯这个约束条件。再如上图所示,笔者在SELECT语句中对NUM数据范例举办了转换,从数值型数据转换为字符型数据。在这个过程中,新表的数据范例确凿转换过来了,但是从结果中可以看到,这个字段的约束条件没有继承 过来。原表中这个字段有一个非空的约束条件,而在方针表中则没有。

  按照笔者的了解 ,只有在变动数据范例的情况下,这个非空等约束条件才不会被生涯下来。假如只是变动了方针列的名字(通过查询列的别名 来实现),如上图所示的name列,这个约束条件如故会生涯下来。在某些参考书上,对这个约束条件的刻画有过错。笔者早年在学习的时间,也受其误导过。列位数据库管理 员在这方面必要 引起重视。为了加深相识,列位数据库管理 员可以归去举办测试,以确定 笔者所说的是否精确 。

  三、索引与默认值不肯定 会被继承 。

  固然是否为空等约束条件可以生涯下来,但是并不是说方针列中的全部内容都可以被继承 下来。在界说表的时间,除了指定某个列是否为非空之外,还可以设置其他的一些内容。如可以设置某个列的默认值,可能对某个列设置唯一索引等等。那么这些字段的界说在应用 CTAS来创建 表格的时间是否会被生涯下来呢?

  如上图所示,在原表中NUM字段设置了一个默认值为0。然后操作CTAS创建 表之后,好象这个默认值不存在了。这是否阐发 这个默认值不会被继承 了呢?着实 ,上面这个例子中之以是这个默认值没有在新表中的字段中被生涯下来,重要 是由于其变动了数据范例,将数值型改为了字符型的数据范例。假如不变动数据范例的话,这个默认值的设置如故会像非空条件设置那样被生涯下来。纵然列名变动了,默认值如故会被继承 。结合上面的非空条件设置,我们可以得出一个结论,当数据范例被变动了,则针对列的非空条件与默认值的设置,都不会被生涯下来。但是假如只是方针列的名字该了,则非空条件与默认值的干系 设置会被生涯。这一点人人在推行 这个操纵的时间,必要 出格的留意 ,不然的话就也许会出现题目。

  固然默认值在不变动数据范例的情况下,会被生涯下来。但是必要 留意的是,索引无论在什么情况下都不会被生涯(按照笔者的测试)。如在上例中,笔者在原表的VALUE字段中设置了一个唯一索引。此时纵然不变动字段VALUE字段的数据范例可能方针列的名字,其在新表中也不会生涯下来。以是,索引跟默认值、非空条件是不一样的。至少在CTAS方案 中他们显露出了不一样的特性 。

  四、可以只复制表结构,而不插入记实。

  在操作CTAS来创建 新表的时间,出了可以创建 表结构之外,还可以将干系 的记实也插入到方针表中。但是偶然间数据库管理 员也许不必要 插入记实,而只必要 一个表结构即可。着实 要实现这个需求也是很大略 的。如上例中,纵然原表中没有任何记实,只要这些字段存在,其如故可以创建 新表。这可以给我们什么启示呢?着实 假如 SELECT语句没有返回任何记实的话,那么CTAS语句就不会往新表中插入记实。在推行 CTAS语句时可以操作WHERE条件语句来过滤记实。如只插入部分 数据等等。在设置这个WHERE条件语句时,假如没有一条记实切合这个条件,那么体系 就只会返回表的框架结构。此时就可以复制表的结构,而不插入任何记实了。

  五、前进推行 遵从 ,最好不做日记记实。

  当新表中的记实比拟 多而没有采用 WHERE条件语句举办过滤(可能过滤后如故有很多 的记实 ),则在推行 这个语句时也许会耗费 比拟 长的工夫。由于在默认情况下,往数据库表中插入数据的时间,不只必要 更新记实 (数据高速缓存可能数据文件),并且还必要 更新干系 的日记 (重做日记高速缓存可能重做日记文件)。为此当必要 插入大宗记实的时间,其速率就会比拟 慢,如会频仍的触发日记切换变乱可能会触发DBWR进程等等。为此在往数据库中插入大宗数据的时间,最亏得语句中应用 NOLOGGING选项,让数据库不记实干系 的重做日记信息,早年进插入的速率。其它为了保障数据的安详,最亏得插入完成之后,立刻对数据库可能干系 的表空间举办备份。认为此时由于干系 更新没有记实到重做日记中,为此当出现妨碍时将很难规复。

  六、操作排序来优化存储结构。

  一样平常情况下,表中的记实都是服从工夫的先其后举办存储的,而不是服从关键子可能索引的序次 。为此当记实多了的时间,这个查询的速率就会比拟 慢。以是在向数据库表中插入数据的时间,偶然间最好对记实举办重新排序,以优化记实的存储结构。以是在推行 CTAS语句的时间,假如在创建 表的过程中同时插入大宗的记实,最好先对记实举办排序。然后再将其插入到方针表中。为了数据库的性能思量 ,笔者凶猛提议这么做。

from:http://linux.net527.cn/fuwuqiyingyong/Oracle/2010/1116/34446.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值