CREATE TABLE ... AS SELECT statement(CTAS):用CTAS语句可以根据一个存在的表创建一个新的表,而且能够根据对应的过滤条件将源表部分或者全部数据插入到新表当中。

今天用到CTAS,仔细看了一下文档,发现CTAS相关的内容其实并不简单。

假设现在有一个图书表:books,表结构如下:

 scott@UPDB> create table books(book_id number(6) primary key,book_name varchar2(20) not null,book_desc varchar2(200),book_price number(9,2)); 

 Table created.

 scott@UPDB> desc books
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
BOOK_ID NOT NULL NUMBER(6)
BOOK_NAME NOT NULL VARCHAR2(20)
BOOK_DESC VARCHAR2(200)
BOOK_PRICE NUMBER(9,2) scott@UPDB>

现在要创建一个新的表new_book,结果要求和已经存在的表的结构一致,肯定用CTAS来创建:

 scott@UPDB> create table new_books as select book_id,book_name,book_desc,book_price from books;

 Table created.

 scott@UPDB> desc new_books
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
BOOK_ID       NUMBER(6)
BOOK_NAME NOT NULL VARCHAR2(20)
BOOK_DESC      VARCHAR2(200)
BOOK_PRICE     NUMBER(9,2) scott@UPDB>

有没有发现点什么?在源表中BOOK_ID是主键,现在new_books中BOOK_ID不是,下面来确定一下:

 scott@UPDB> select constraint_name,constraint_type,table_name from user_constraints where table_name like '%BOOKS';

 CONSTRAINT_NAME            C TABLE_NAME
------------------------------ - ------------------------------
SYS_C0011889 C BOOKS
SYS_C0011896 C NEW_BOOKS
SYS_C0011890 P BOOKS scott@UPDB>

确实在new_books中BOOK_ID已经不在是主键。在new_books中只有一个非空主键。在CTAS不能将主键约束传递到新表中。


现在将books表更新一下,将book_desc设置默认值为"very good":

 scott@UPDB> alter table books modify(book_desc default 'very good');

 Table altered.

验证默认值设置:

 scott@UPDB> select * from books;

    BOOK_ID BOOK_NAME        BOOK_DESC         BOOK_PRICE
---------- -------------------- -------------------- ----------
1 C# GOOD ########## scott@UPDB> insert into books (book_id,book_name,book_price) values (2,'JAVA',8.3); 1 row created. scott@UPDB> select * from books; BOOK_ID BOOK_NAME BOOK_DESC BOOK_PRICE
---------- -------------------- -------------------- ----------
1 C# GOOD ##########
2 JAVA very good ##########

将new_books表删除,

 scott@UPDB> drop table new_books;

 Table dropped.

然后在创建new_books表:

 scott@UPDB> create table new_books as select * from books;

 Table created.

 scott@UPDB> desc new_books
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
BOOK_ID NUMBER(6)
BOOK_NAME NOT NULL VARCHAR2(20)
BOOK_DESC VARCHAR2(200)
BOOK_PRICE NUMBER(9,2)

验证默认值在新表中是否有作用:

 scott@UPDB> insert into new_books(book_id,book_name,book_price) values (1,'C#',8.5);

 1 row created.

 scott@UPDB> select * from new_books;

    BOOK_ID BOOK_NAME        BOOK_DESC         BOOK_PRICE
---------- -------------------- -------------------- ----------
1 C# GOOD ##########
2 JAVA very good ##########
1 C# ########## scott@UPDB>

在新创建的new_book中的book_desc没有默认值选项。所以在CTAS中也不能传递默认值。

将new_books表再次删除,将books表中的数据清除,在books中添加唯一性约束在尝试一下:

 scott@UPDB> drop table new_books;

 Table dropped.

 scott@UPDB> delete from books;

 2 rows deleted.

 scott@UPDB> 

给books表中的book_name设置唯一性索引,并查看:

 scott@UPDB> alter table books modify(book_name unique);

 Table altered.

 scott@UPDB> select constraint_name,constraint_type,table_name from user_constraints where table_name='BOOKS';

 CONSTRAINT_NAME            C TABLE_NAME
------------------------------ - ------------------------------
SYS_C0011889 C BOOKS
SYS_C0011890 P BOOKS
SYS_C0011898 U BOOKS scott@UPDB>

在创建new_books表,在查看一下新表中的约束:

 scott@UPDB> create table new_books as select * from books;

 Table created.

 scott@UPDB> select constraint_name,constraint_type,table_name from user_constraints where table_name='NEW_BOOKS';

 CONSTRAINT_NAME            C TABLE_NAME
------------------------------ - ------------------------------
SYS_C0011899 C NEW_BOOKS scott@UPDB>

此时新表new_books中,只有一个非空约束,在CTAS中唯一性约束也不能传递。

在books中添加一个索引,因为主键和唯一性约束的时候自动创建索引,查看books中的索引:

 scott@UPDB> select index_name,table_name,column_name from user_ind_columns where table_name='BOOKS';

 INDEX_NAME         TABLE_NAME             COLUMN_NAME
-------------------- ------------------------------ --------------------
SYS_C0011890 BOOKS BOOK_ID
SYS_C0011898 BOOKS BOOK_NAME scott@UPDB>

再看new_books中的情况:

 scott@UPDB> select index_name,table_name,column_name from user_ind_columns where table_name='NEW_BOOKS';

 no rows selected

 scott@UPDB> 

在new_books中没有索引,所以CTAS也不能传递索引。

CTAS中只能够将表的列的结构、列名、数据类型、可选的行记录、单独创建的非空索引才能够传递到新表中,其他的都不包括。

CTAS都能带走源表的哪些属性的更多相关文章

  1. ODI基于源表时间戳字段获取增量数据

    实现目标:通过ODI获取一个没有时间戳的子表(qb_bw)的增量数据,而主表(qb_tb)有一个rksj入库时间,且主表和子表之间通过ID关联.目标表名是qb_bw1. 设计原理:通过在ODI的map ...

  2. Sql server的Merge语句,源表中如果有重复数据会导致执行报错

    用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说 ...

  3. merge源表数据移植到目标表新表数据中

    merge into dbo.ak_SloteCardTimes a using(select RecordID,CardNO,SloteCardTime from dbo.Tb_CardDate b ...

  4. oracle merge 目标表以及源表存在重复列的问题(转)

    SQL> select * from t_source;                                                                      ...

  5. lucene反向索引——倒排表无论是文档号及词频,还是位置信息,都是以跳跃表的结构存在的

    转自:http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html 4.2. 反向信息 反向信息是索引文件的核心,也即反向索 ...

  6. 不论报任何错误 都是网络源有问题,安装spacemacs报错的解决方式

    不论报任何错误 都是网络源有问题 打开.spacemacs ### 这是原头部 (defun dotspacemacs/layers ()   "Configuration Layers d ...

  7. H5表单中placeholder属性的字体颜色问题

    最近做项目的时候遇到的一些小样式问题,有关表单.并且在接下来几天的面试人中五个人都没有回答上来,改变placeholder属性的默认字体颜色,感觉有必要总结一下. 如何改变默认字体的颜色? @blue ...

  8. jquery】常用的jquery获取表单对象的属性与值

    [jquery]常用的jquery获取表单对象的属性与值 1.JQuery的概念 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用一些简单的代码实现一些复杂的 ...

  9. 小贝_mysql建表以及列属性

    mysql建表以及列属性 简要: 一.建表原则 二.具体的列属性说明 一.建表原则 建表: 事实上就是声明列的过程,数据终于是以文件的形式放在硬盘(内存) 列: 不同的列类型占的空间不一样. 选列的原 ...

随机推荐

  1. Oracle数据库迁移--->从Windows到Linux

    I did a practice to migrate the oracle database from windows to linux operation system. The followin ...

  2. IOS开发---菜鸟学习之路--(十九)-利用NSUserDefaults存储数据

    利用NSUserDefaults的可以快速的进行本地数据存储,但是支持的格式有限, 至于支持什么格式大家可以再自行脑补 我这边直接讲如何使用 NSUserDefaults 分为两部分 一个是存数据 N ...

  3. ogre3D学习基础17 --- 如何手动创建ogre程序

    建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...

  4. Leetcode 529.扫雷游戏

    扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖 ...

  5. caffe-dnnh实验

    下面是我在做基于深度哈希的大规模图像检索中的一个实验,相关文档介绍给大家,具体内容查看提供的相关链接,总结的很到位了,我就不再赘述. 实践cvpr2015年的深度哈希图像检索论文:Simultaneo ...

  6. SVD简化数据

    一,引言 我们知道,在实际生活中,采集到的数据大部分信息都是无用的噪声和冗余信息,那么,我们如何才能剔除掉这些噪声和无用的信息,只保留包含绝大部分重要信息的数据特征呢? 除了上次降到的PCA方法,本次 ...

  7. [Python]Pandas简单入门(转)

    本篇文章转自 https://colab.research.google.com/notebooks/mlcc/intro_to_pandas.ipynb?hl=zh-cn#scrollTo=zCOn ...

  8. proteus仿真 引脚显示电平变化但不能显示波形

    proteus仿真 引脚显示电平变化但不能显示波形 原来是没有选择通道问题,proteus默认优先使用A通道才会显示波形,如果优先使用B,C,D通道,需要选择...

  9. BZOJ1396&2865 识别子串 【后缀自动机 + 线段树】

    题目 输入格式 一行,一个由小写字母组成的字符串S,长度不超过10^5 输出格式 L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. 输入样例 agoodcookcooksg ...

  10. 字符串函数 (strfun)

    字符串函数 (strfun) 题目描述 两个等长的由大写英文字母构成的字符串a和b,从a中选择连续子串x,从b中选出连续子串y.子串x与子串y的长度相等. 定义函数f(x,y)为满足条件xi=yi(1 ...