CTAS都能带走源表的哪些属性
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都能带走源表的哪些属性的更多相关文章
- ODI基于源表时间戳字段获取增量数据
实现目标:通过ODI获取一个没有时间戳的子表(qb_bw)的增量数据,而主表(qb_tb)有一个rksj入库时间,且主表和子表之间通过ID关联.目标表名是qb_bw1. 设计原理:通过在ODI的map ...
- Sql server的Merge语句,源表中如果有重复数据会导致执行报错
用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说 ...
- merge源表数据移植到目标表新表数据中
merge into dbo.ak_SloteCardTimes a using(select RecordID,CardNO,SloteCardTime from dbo.Tb_CardDate b ...
- oracle merge 目标表以及源表存在重复列的问题(转)
SQL> select * from t_source; ...
- lucene反向索引——倒排表无论是文档号及词频,还是位置信息,都是以跳跃表的结构存在的
转自:http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html 4.2. 反向信息 反向信息是索引文件的核心,也即反向索 ...
- 不论报任何错误 都是网络源有问题,安装spacemacs报错的解决方式
不论报任何错误 都是网络源有问题 打开.spacemacs ### 这是原头部 (defun dotspacemacs/layers () "Configuration Layers d ...
- H5表单中placeholder属性的字体颜色问题
最近做项目的时候遇到的一些小样式问题,有关表单.并且在接下来几天的面试人中五个人都没有回答上来,改变placeholder属性的默认字体颜色,感觉有必要总结一下. 如何改变默认字体的颜色? @blue ...
- jquery】常用的jquery获取表单对象的属性与值
[jquery]常用的jquery获取表单对象的属性与值 1.JQuery的概念 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用一些简单的代码实现一些复杂的 ...
- 小贝_mysql建表以及列属性
mysql建表以及列属性 简要: 一.建表原则 二.具体的列属性说明 一.建表原则 建表: 事实上就是声明列的过程,数据终于是以文件的形式放在硬盘(内存) 列: 不同的列类型占的空间不一样. 选列的原 ...
随机推荐
- Windows网络编程笔记5 -- 其他套接字
包括红外线套接字(IrSock).IPX/SPX 套接字.NetBIOS 套接字.AppleTalk 套接字.ATM 套接字等.对这些套接字进行简单介绍. 第一.红外线套接字(I r S o c k) ...
- C# 中的 #region 和 #endregion 的作用
C#中的 #region 和 #endregion 表示一块区域,这样在 Visual Studio 中可以将这块区域的代码折叠起来,便于查看. 虽然Visual Studio 也响应大括号的折叠,但 ...
- spring bean自动注入
使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...
- PHP共享内存的应用shmop系列
简单的说明 可能很少情况会使用PHP来操控共享内存,一方面在内存的控制上,MC已经提供了一套很好的方式,另一方面,自己来操控内存的难度较大,内存的读写与转存,包括后面可能会用到的存储策略,要是没有一定 ...
- sql server 韩文查询匹配失败
在SQL Server 中查询韩文信息时,没有匹配到对应的信息,检查程序后发现字段类型是nvarchar类型的没有问题, 打开存储过程后找到问题了:原来是拼接后的查询语句存储在一个varchar变量中 ...
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- THUSC2018 爆零记
没想到我还真能过这个...... 太玄学了= = 不过这直接导致我月考数学挂科,掉出年级前十= = 5.26 THU过了! 真是十分意外的惊喜啊$-\omega-$ 6.1 今天出发去帝都! 然而飞行 ...
- svg动画 之 我的自制太阳系
SVG意为可缩放矢量图形,svg的图片与普通的jpg,png等图片相比,其优势在于不失真.一般普通的图片放大后,会呈现出锯齿的形状,但是svg图片则不会这样,它可以被高质量地打印. 现在就用dream ...
- 洛谷 [P1608] 最短路计数
最短路计数模版 本题要注意重边的处理 #include <iostream> #include <cstdio> #include <algorithm> #inc ...
- LOJ#2307. 「NOI2017」分身术
$n \leq 100000$个点,$m \leq 100000$次询问,每次问删掉一些点后的凸包面积. 不会啦写个20暴力,其实是可以写到50的.当个计算几何板子练习. //#include< ...