暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CTAS will loss default value define on columns

原创 Anbob 2013-05-17
714

This is about the CTAS (Create Table As Select...) operations during the creation of partitioned tables from normal tables in an Oracle database and createion no_partition tables same as that.

The CTAS operation although copies column constraints such as NULL, NOT NULL from the normal table to the partitioned table during the partitioned table creation, it does not copy DEFAULT VALUEs of the columns.

anbob@DEVDB>l
1 SELECT COLUMN_NAME,DATA_TYPE,DATA_DEFAULT FROM dba_TAB_COLUMNS WHERE TABLE_NAME='ICME_PROJECT_SCORE' and owner='ICME6'
2*
anbob@DEVDB>/
COLUMN_NAME DATA_TYPE DATA_DEFAULT
------------------------------ ------------------------------ ------------------------------
SCORE_ID NUMBER
IC_CODE VARCHAR2
SCORE_ACTIVITY_DATE DATE
SCORE_REMARK VARCHAR2
SUBJECT_ID NUMBER
GIVE_ORG_ID NUMBER
FROM_ORG_ID NUMBER
SCORE_CHECK_FLAG NUMBER
ORG_ID NUMBER
ADMIN_ID NUMBER
CREATE_TIME DATE SYSDATE
UPDATE_TIME DATE SYSDATE
IS_VALID NUMBER 0
TO_ORG_ID NUMBER
REPEAT_FLAG NUMBER 0
SOURCE_FLAG NUMBER 1
anbob@DEVDB>create table parttab
2 partition by hash(score_id) partitions 8 as select * from icme6.icme_project_score where rownum<10;
Table created.

Tip:
Create the partitioned table with CTAS from the normal table above, consider using NOLOGGING or PARALLEL table creation option to avoid trashing the logs if you think this data is recoverable from elsewhere. This will also create the table faster.

anbob@DEVDB>select table_name,partition_name from user_tab_partitions;
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
PARTTAB SYS_P46
PARTTAB SYS_P44
PARTTAB SYS_P42
PARTTAB SYS_P43
PARTTAB SYS_P41
PARTTAB SYS_P45
PARTTAB SYS_P47
PARTTAB SYS_P48
anbob@DEVDB>SELECT COLUMN_NAME,DATA_TYPE,DATA_DEFAULT FROM dba_TAB_COLUMNS WHERE TABLE_NAME='PARTTAB' and owner='ANBOB';
COLUMN_NAME DATA_TYPE DATA_DEFAULT
------------------------------ ------------------------------ ------------------------------
SCORE_ID NUMBER
IC_CODE VARCHAR2
SCORE_ACTIVITY_DATE DATE
SCORE_REMARK VARCHAR2
SUBJECT_ID NUMBER
GIVE_ORG_ID NUMBER
FROM_ORG_ID NUMBER
SCORE_CHECK_FLAG NUMBER
ORG_ID NUMBER
ADMIN_ID NUMBER
CREATE_TIME DATE
UPDATE_TIME DATE
IS_VALID NUMBER
TO_ORG_ID NUMBER
REPEAT_FLAG NUMBER
SOURCE_FLAG NUMBER

anbob@DEVDB>create table testpart as select * from icme6.ICME_PROJECT_SCORE where rownum<=20;
anbob@DEVDB>SELECT COLUMN_NAME,DATA_TYPE,DATA_DEFAULT FROM dba_TAB_COLUMNS WHERE TABLE_NAME='TESTPART' and owner='ANBOB';

COLUMN_NAME DATA_TYPE DATA_DEFAULT
------------------------------ ------------------------------ ------------------------------
SCORE_ID NUMBER
IC_CODE VARCHAR2
SCORE_ACTIVITY_DATE DATE
SCORE_REMARK VARCHAR2
SUBJECT_ID NUMBER
GIVE_ORG_ID NUMBER
FROM_ORG_ID NUMBER
SCORE_CHECK_FLAG NUMBER
ORG_ID NUMBER
ADMIN_ID NUMBER
CREATE_TIME DATE
UPDATE_TIME DATE
IS_VALID NUMBER
TO_ORG_ID NUMBER
REPEAT_FLAG NUMBER
SOURCE_FLAG NUMBER

To fix this problem, you will have to either explicitly change your code to pass in a date value for the hava default value columns, or alter the table after CTAS and modify the column to have a default value.

anbob@DEVDB>create table parttab_2(score_id,REPEAT_FLAG default 0)
partition by hash(score_id) partitions 8
as select score_id,REPEAT_FLAG from icme6.icme_project_score where rownum<10;
Table created.
anbob@DEVDB>SELECT COLUMN_NAME,DATA_TYPE,DATA_DEFAULT FROM dba_TAB_COLUMNS WHERE TABLE_NAME='PARTTAB_2' and owner='ANBOB'
COLUMN_NAME DATA_TYPE DATA_DEFAULT
------------------------------ ------------------------------ ------------------------------
SCORE_ID NUMBER
REPEAT_FLAG NUMBER 0

or

anbob@DEVDB>alter table parttab modify REPEAT_FLAG default 0;
Table altered.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论