ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 表结构的非完全复制

oracle 表结构的非完全复制

原创 Linux操作系统 作者:lnwxzyp 时间:2009-08-20 11:52:50 0 删除 编辑
今天有同事在问 复制表的时候 会把表的 not null 属性也复制过来,而他要求对复制过来的字段不加not null 字段
SQL> desc DW_ACCOUNT
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ACCT_ID                                   NOT NULL NUMBER(12)
 ACCT_CD                                            VARCHAR2(100)
 AREA_ID                                            NUMBER(5)
 AREA_NAME                                          VARCHAR2(200)
 PARTY_ID                                           NUMBER(12)
 ACCT_STATUS_CD                                     NUMBER(5)
 ACCT_STATUS                                        VARCHAR2(200)
 ACCT_STATUS_REASON_CD                              NUMBER(5)
 CREDIT_CLASS_CD                                    NUMBER(5)
 LIMIT_QTY                                          NUMBER(12)
 PROD_ID                                            NUMBER(12)
 ACCT_TYPE_CD                                       NUMBER(5)
 START_DT                                           DATE
 IF_FREE                                            VARCHAR2(1)
 ACCT_NAME                                          VARCHAR2(200)
 RELATED_ACCT_ID                                    NUMBER(12)
 PAYMENT_ACCOUNT_ID                                 NUMBER(12)
这里可以看到 ACCT_ID 是 NOT NULL的限制,我们这里复制DW_ACCOUNT的表结构
SQL> create table zyp_test as select * from dw_account where 1=2;
表已创建。
SQL> desc zyp_test;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ACCT_ID                                   NOT NULL NUMBER(12)
 ACCT_CD                                            VARCHAR2(100)
 AREA_ID                                            NUMBER(5)
 AREA_NAME                                          VARCHAR2(200)
 PARTY_ID                                           NUMBER(12)
 ACCT_STATUS_CD                                     NUMBER(5)
 ACCT_STATUS                                        VARCHAR2(200)
 ACCT_STATUS_REASON_CD                              NUMBER(5)
 CREDIT_CLASS_CD                                    NUMBER(5)
 LIMIT_QTY                                          NUMBER(12)
 PROD_ID                                            NUMBER(12)
 ACCT_TYPE_CD                                       NUMBER(5)
 START_DT                                           DATE
 IF_FREE                                            VARCHAR2(1)
 ACCT_NAME                                          VARCHAR2(200)
 RELATED_ACCT_ID                                    NUMBER(12)
 PAYMENT_ACCOUNT_ID                                 NUMBER(12)
可以看到 NOT NULL的属性也随之被复制过来了,如果能够在复制的时候 不复制NOT NULL的属性呢?
SQL> drop table zyp_test;
表已删除。
SQL> purge table zyp_test;
表已清除。
SQL> create table zyp_test (acct_id null, acct_cd not null) as select acct_id,ac
ct_cd from dw_account where 1=2;
表已创建。
SQL> desc zyp_test;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ACCT_ID                                            NUMBER(12)
 ACCT_CD                                   NOT NULL VARCHAR2(100)
由于字段太多我就不做完全的复制了,这里其实可以发现 我们可以将源表的字段属性进行更改,NULL和NOT NULL都可以进行设置,当然如果在字段后面不加NULL或者NOT NULL的话,复制的表就会完全继承源表的字段属性。
那么复制过来的原本非空(NOT NULL)的 会不会有值呢?
再次进行测试:
SQL> create table zyp_test (acct_id null, acct_cd not null) as select acct_id,ac
ct_cd from dw_account where rownum<2;
表已创建。
SQL> select * from zyp_test;
   ACCT_ID   ACCT_CD
--------------------------------------------------------------------------------
8.2000E+11   822818663
由此可以看到,字段属性发生改变不会对非空字段修改为允许空 字段造成影响,而如果将允许空字段改为非空字段,遇到null值就会报错了。
SQL> CREATE TABLE zyp_test (acct_id null, credit_class_cd NOT NULL) AS SELECT ac
ct_id,credit_class_cd FROM DW_ACCOUNT WHERE ROWNUM<2;
CREATE TABLE zyp_test (acct_id null, credit_class_cd NOT NULL) AS SELECT acct_id
,credit_class_cd FROM DW_ACCOUNT WHERE ROWNUM<2
 *
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("STATA"."ZYP_TEST"."CREDIT_CLASS_CD")
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12216142/viewspace-612734/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    129
  • 访问量
    672550