create table as 产生的问题
2012-12-20 16:53
471 查看
--1、非空约束遗失
-->使用create table as 来创建对象
scott@CNMMBO> create table tb_dept as select * from dept where 1=0;
Table created.
scott@CNMMBO> desc dept;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
scott@CNMMBO> desc tb_dept;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
-->从上面的desc可以看出新创建的表少了非空约束
-->下面手动为其增加非空约束,增加后与原来的表是一致的。当然使用create table as时,索引是需要单独重建的。
scott@CNMMBO> alter table tb_dept modify (deptno not null);
Table altered.
scott@CNMMBO> drop table tb_dept; -->删除刚刚穿件的表tb_dept
Table dropped.
--2、存在非空约束时default约束遗失
-->下面为表dept的loc列添加非空约束,且赋予default值
scott@CNMMBO> alter table dept modify (loc default 'BeiJing' not null);
Table altered.
-->为原始表新增一条记录
scott@CNMMBO> insert into dept(deptno,dname) select 50,'DEV' from dual;
1 row created.
scott@CNMMBO> commit;
Commit complete.
-->下面的查询可以看到新增记录50的loc为缺省值'BeiJing'
scott@CNMMBO> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV BeiJing
-->再次使用create table as来创建对象
scott@CNMMBO> create table tb_dept as select * from dept;
Table created.
-->从下面可知,由于列loc存在default值,所以此时not null约束被同时赋予
scott@CNMMBO> desc tb_dept
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC NOT NULL VARCHAR2(13)
scott@CNMMBO> select * from tb_dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV BeiJing
-->为新创建的表新增记录
-->新增时发现尽管not null约束生效,但原表上设定的default值不存在了
scott@CNMMBO> insert into tb_dept(deptno,dname) select 60,'HR' from dual;
insert into tb_dept(deptno,dname) select 60,'HR' from dual
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TB_DEPT"."LOC")
scott@CNMMBO> drop table tb_dept;
Table dropped.
--4、最彻底的解决办法
scott@CNMMBO> select dbms_metadata.get_ddl('TABLE','DEPT') from dual;
DBMS_METADATA.GET_DDL('TABLE','DEPT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13) DEFAULT 'BeiJing' NOT NULL ENABLE,
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL" ENABLE,
UNIQUE ("DNAME")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL"
--5、演示环境
scott@CNMMBO> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
--6、演示结论
-->create table as 尽管会克隆表及数据,数据是完整的,但是结构部分仅仅是部分克隆
-->create table as 会使用表上的约束被遗失或出于非正常状态
-->create table as 时,表上的索引、触发器等不会被同时克隆
-->create table as 仅作测试使用,要得到完整的结构语句,还是使用dbms_metadata.get_ddl包
-->Author: Robinson Cheng
-->Blog: http://blog.csdn.net/robinson_0612
-->使用create table as 来创建对象
scott@CNMMBO> create table tb_dept as select * from dept where 1=0;
Table created.
scott@CNMMBO> desc dept;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
scott@CNMMBO> desc tb_dept;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
-->从上面的desc可以看出新创建的表少了非空约束
-->下面手动为其增加非空约束,增加后与原来的表是一致的。当然使用create table as时,索引是需要单独重建的。
scott@CNMMBO> alter table tb_dept modify (deptno not null);
Table altered.
scott@CNMMBO> drop table tb_dept; -->删除刚刚穿件的表tb_dept
Table dropped.
--2、存在非空约束时default约束遗失
-->下面为表dept的loc列添加非空约束,且赋予default值
scott@CNMMBO> alter table dept modify (loc default 'BeiJing' not null);
Table altered.
-->为原始表新增一条记录
scott@CNMMBO> insert into dept(deptno,dname) select 50,'DEV' from dual;
1 row created.
scott@CNMMBO> commit;
Commit complete.
-->下面的查询可以看到新增记录50的loc为缺省值'BeiJing'
scott@CNMMBO> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV BeiJing
-->再次使用create table as来创建对象
scott@CNMMBO> create table tb_dept as select * from dept;
Table created.
-->从下面可知,由于列loc存在default值,所以此时not null约束被同时赋予
scott@CNMMBO> desc tb_dept
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC NOT NULL VARCHAR2(13)
scott@CNMMBO> select * from tb_dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV BeiJing
-->为新创建的表新增记录
-->新增时发现尽管not null约束生效,但原表上设定的default值不存在了
scott@CNMMBO> insert into tb_dept(deptno,dname) select 60,'HR' from dual;
insert into tb_dept(deptno,dname) select 60,'HR' from dual
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TB_DEPT"."LOC")
scott@CNMMBO> drop table tb_dept;
Table dropped.
--4、最彻底的解决办法
scott@CNMMBO> select dbms_metadata.get_ddl('TABLE','DEPT') from dual;
DBMS_METADATA.GET_DDL('TABLE','DEPT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13) DEFAULT 'BeiJing' NOT NULL ENABLE,
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL" ENABLE,
UNIQUE ("DNAME")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "GOEX_USERS_TBL"
--5、演示环境
scott@CNMMBO> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
--6、演示结论
-->create table as 尽管会克隆表及数据,数据是完整的,但是结构部分仅仅是部分克隆
-->create table as 会使用表上的约束被遗失或出于非正常状态
-->create table as 时,表上的索引、触发器等不会被同时克隆
-->create table as 仅作测试使用,要得到完整的结构语句,还是使用dbms_metadata.get_ddl包
-->Author: Robinson Cheng
-->Blog: http://blog.csdn.net/robinson_0612
相关文章推荐
- create table as 产生的问题
- 慎用create table as select,一定要注意默认值的问题
- create table as及并行相关问题
- 慎用create table as select,一定要注意默认值的问题
- 慎用create table as select,一定要注意默认值的问题
- 慎用create table as select,一定要注意默认值的问题
- 原表是nologging,为什么create table.. as select还是有redo log产生?
- 慎用create table as select,一定要注意默认值的问题---大一临时表方法
- Create table Text_Test([id] int identity(1, 1) not null, [article] text collate Chinese_PRC_CI_AS not null) text, collate
- 当心 CREATE TABLE AS
- Oracle Create Table as Select
- table 'xxx' marked as crashed and should be repaired问题的处理
- MySQL create table as与create table like对比
- mysql修改lower_case_table_names产生的问题
- CREATE TABLE AS语句与循环游标的使用实例
- MySQL中表复制:create table like 与 create table as select
- 浅谈create table as select
- oracle 中 create table tb_content_bak as select * from tb_content where 1=2 long字段解决办法
- create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;
- oracle create table a as select * from b