今天有同事在问 复制表的时候 会把表的 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")