首页 > 其他分享 >create table as引发的问题

create table as引发的问题

时间:2024-05-13 19:31:02浏览次数:23  
标签:-- create 引发 CNMMBO dept scott table tb

转自:https://blog.csdn.net/leshami/article/details/7362156

1.create table as引发的问题

由于是对原表进行克隆,且数据存储在不同的表空间,因此毫不犹豫地使用了CREATE TABLE AS,结果在运行package时,error...

演示如下:

--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.
 
--3、唯一约束遗失
scott@CNMMBO> alter table dept modify (dname unique);
 
Table altered.
 
scott@CNMMBO> create table tb_dept as select * from dept;
 
Table created.
 
scott@CNMMBO> insert into tb_dept select 60,'DEV','ShangHai' from dual;
 
1 row created.
 
scott@CNMMBO> commit;
 
Commit complete.
 
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
        60 DEV            ShangHai
 
-->有关check约束与外键约束不再演示

2.问题解决

通过dbms_metadata包的get_ddl过程进行获取完整的表结构

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"

3.结论

  1. create table as时,尽管会克隆表及数据,数据是完整的,但是结构部分仅仅是部分克隆
  2. create table as时,会使表上的约束被遗失或出于非正常状态
  3. create table as时,表上的索引、触发器等不会被同时克隆
  4. create table as 仅作测试使用,要得到完整的结构语句,还是使用dbms_metadata.get_ddl包

标签:--,create,引发,CNMMBO,dept,scott,table,tb
From: https://www.cnblogs.com/dclogs/p/18189838

相关文章

  • 1250 - Table 'd' from one of the SELECTs cannot be used in field list
    1问题描述sql数据库查询接口union后orderby某字段,提示错误“1250-Table'd'fromoneoftheSELECTscannotbeusedinfieldlist“。移除orderby条件,就不会报错,但是不满足按照某个字段排序。 2方案解决修改排序条件为:orderbystatId即可。(union后的结果是字段......
  • Stable Diffusion:原理、应用与未来展望
    一、引言在人工智能的快速发展中,StableDiffusion作为一种先进的随机过程模型,受到了广泛的关注。StableDiffusion不仅能够描述许多自然和人工系统中的随机演化行为,而且在多个领域展现出了广泛的应用潜力。本文将详细介绍StableDiffusion的原理、应用以及未来的发展趋势。立即......
  • layui table 选项卡刷新后依旧保留上一个打开的索引
    $(".layui-tab-titleli").click(function(){varmy_clue_detail_tab_index=$(this).index();sessionStorage.setItem("my_clue_detail_tab_index",my_clue_detail_tab_index);});$(function(){vargetPicTabN......
  • 【TransmittableThreadLocal】TransmittableThreadLocal的实现机制和原理
    1 前言前面我看过了 ThreadLocal的实现机制和原理 以及 InheritableThreadLocal的实现机制和原理 两种类型的ThreadLocal,前者是普通的,后者是在前者的基础上套了一层父子线程关系,当使用后者的时候,会在线程创建的时候,浅拷贝一份父线程的变量值。那么今天空了,我来看看另外一......
  • 服务器挂载磁盘!!!centos7要重启服务器才能pvcreate成功
    分区的类型代码`8e`表示LinuxLVM(LogicalVolumeManagement)分区。如果您想将`/dev/sda3`分区用作LVM的一部分,那么它的分区类型应该是`8e`而不是通用的`83`Linux分区类型。根据您之前提供的`fdisk-l`输出,`/dev/sda3`当前是`83`类型,这意味着它被识别为一个......
  • 记一次由sequence引发的enq sv-contention等待事件
    转自:https://www.cnblogs.com/lijiaman/p/10423272.html#4237610数据库版本:11.2.0.4RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增,大约到了80个会话。通过查看EM的SQL信息,发现等待产生于SQL语句selectTIMEKEYID.nextvalfromdual (二)问题追踪......
  • (非原创)Stable Diffusion 提示词prompt tag语法总结
    基本认知提示词会相互污染,要尽可能地做减法。XL版本主推使用自然语言使用注释将修饰词汇限定给某个主体,避免提示词污染1girl(silverlonghair,purpleeyes),yellowsuit2people(1girlAND1boy)2characters(1girlAND1dog)权重调整旧语法:(){}加大权重,[]......
  • Python-PostgreSQL主键自动填充报错:SAWarning: Column x is marked as a member of th
    importdatetimefromsqlalchemyimportColumn,String,inspect,Integerfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_engineengine=create_engine(DATABASE_URL)Base=decla......
  • mysql Code: 1093. You can't specify target table for update in FROM clause
    执行如下sql会报错,大概是delete的where条件里面不能包含自身的表deletefromt_plan_newwhereplan2codeisnotnullandplan2versionisnotnulland(plan2code,plan2version)notin(selectplan2code,max(plan2version)fromt_plan_newgroupbyplan2code) 所以用临......
  • el-table当前行的获取和设置,用于表格行操作
    1、在vue的data区声明当前行变量对象,如果当前行的信息用于了按钮的状态则需要赋予默认值,否则会报找不到属性的错误,比如下面会用到当前记录的status属性值控制按钮是否可用。//表格选中的行data(){return{currentRow:{status:'0'},}}2、在metho......