复制表的(create table table1 as select * from table2 )问题

今天跟罗哥交流了下复制表结构,而产生的问题,下面是详细的列子,

以及问题所在(复制表结构没有把默认值复制,也就是没有完全拷贝)

 

1.原表

 

SQL> edi
已写入 file afiedt.buf

  1  CREATE TABLE USER_SIGNONLINE_TIME_TJ
  2     (    "MOBILE" VARCHAR2(20),
  3          "SIGN_DATE" DATE DEFAULT SYSDATE,           ---SIGN_DATE字段有默认值为sysdate
  4          "LOGOUT_DATE" DATE DEFAULT SYSDATE,         ---LOGOUT_DATE字段有默认值为sysdate
  5          "SECONDS" NUMBER(18,0)
  6     ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  7    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  8*   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
SQL> /

表已创建。

 

 

2.复制表

 

SQL> create table old_table as select * from USER_SIGNONLINE_TIME_TJ
  2  /

表已创建。

 

3.看复制的表的结构

SQL> select dbms_metadata.get_ddl('TABLE','OLD_TABLE') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE','OLD_TABLE')
--------------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."OLD_TABLE"
   (    "MOBILE" VARCHAR2(20),
        "SIGN_DATE" DATE,                     ---SIGN_DATE字段没有默认值为sysdate  
        "LOGOUT_DATE" DATE,                ---LOGOUT_DATE字段没有默认值为sysdate
        "SECONDS" NUMBER(18,0)
   ) 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 "USERS"

 

4.添加默认值

 

SQL> alter table old_table modify SIGN_DATE default sysdate
  2  /

表已更改。

 

SQL> alter table old_table modify LOGOUT_DATE default sysdate
  2  /

表已更改。

 

 

 

 

5.查看添加的表字段的默认值

 

SQL> select dbms_metadata.get_ddl('TABLE','OLD_TABLE') from dual;

DBMS_METADATA.GET_DDL('TABLE','OLD_TABLE')
--------------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."OLD_TABLE"
   (    "MOBILE" VARCHAR2(20),
        "SIGN_DATE" DATE DEFAULT sysdate,
        "LOGOUT_DATE" DATE DEFAULT sysdate,
        "SECONDS" NUMBER(18,0)
   ) 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 "USERS"

 

 

 

 

总结对于大数据量的表结构的操作,尤其是涉及到大数据量的表的复制一定要先查看, 被复制表的结构 ,在进行复制

上面也演示了因为复制表结构的时候默认值没有被复制进来,所以的像上面的第4骤手动添加默认值

--下面的就是忽略了表的复制带来的默认值的问题,所以切记 复制之前查看表结构

create table newtab nologging as  select * from oldtab where 需要的数据条件;

truncate table oldtab;


drop table oldtab;

alter table newtab rename to oldtab



你可能感兴趣的:(oracle)