oracle 表結構的非完全複製
今天有同事在問 複製表的時候 會把表的 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_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)
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> drop table zyp_test;
表已刪除。
SQL> purge 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;
ct_cd from dw_account where 1=2;
表已建立。
SQL> desc zyp_test;
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
ACCT_ID NUMBER(12)
ACCT_CD NOT NULL VARCHAR2(100)
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;
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
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")
第 1 行出現錯誤:
ORA-01400: 無法將 NULL 插入 ("STATA"."ZYP_TEST"."CREDIT_CLASS_CD")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-612734/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql完全複製一個表(結構和資料)MySql
- postgres複製表結構
- MySQL 複製表結構MySql
- mysql表結構複製MySql
- mysql中複製表結構的方法小結MySql
- 【轉載】如何在Oracle中複製表結構和表資料Oracle
- mysql複製表結構和資料MySql
- sql複製表結構和資料SQL
- oracle表機構和資料複製Oracle
- mysql 複製表資料,表結構的3種方法MySql
- mysql 如何複製表結構和資料MySql
- 複製表結構和資料SQL語句SQL
- MySQL(二):主從複製結構、半同步複製、雙主複製結構、利用SSL實現安全的MySQL主從複製MySql
- Oracle如何複製表的sql語句OracleSQL
- 複製使用者結構
- 改變複製物件結構對高階複製的影響物件
- 高階複製-7、測試是否非主鍵表的同步
- ORACLE複製舊錶到新表Oracle
- 【SqlServer】【Oracle】sql複製表定義及複製資料行SQLServerOracle
- MySQL複製表結構和內容到另一張表中的SQL語句MySql
- 主體複製概念和體系結構——高階複製
- 物化檢視複製概念和體系結構——高階複製
- Oracle表結構轉換SqlSERVER表結構 指令碼OracleSQLServer指令碼
- redis主從複製幾種結構Redis
- oracle複製Oracle
- 雙表同結構提取非交集資料
- MySQL表複製MySql
- ORACLE10g Stream表級複製配置Oracle
- 資料結構複習一:雜湊表的總結資料結構
- 【CUDA學習】結構體指標複製結構體指標
- oracle 流複製Oracle
- 結構化與非結構化
- mysql:sql as 複製表MySql
- Oracle中的表結構匯出到wordOracle
- es6完全深複製一個物件物件
- MySQL主從複製結構中常用引數MySql
- 結構體中的指標&&複製賦值建構函式改造結構體指標賦值函式
- MySQL複製的常用架構MySql架構