今天跟罗哥交流了下复制表结构,而产生的问题,下面是详细的列子,
以及问题所在(复制表结构没有把默认值复制,也就是没有完全拷贝)
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
}