表中已有資料,將表中某個欄位為空的改為非空

sky850623發表於2015-05-17
1.需求:
  表t中大概有5億條資料,現需要將表中的is_validate欄位改為非空。考慮到表中有大量資料,而且表還是實時插入,如果直接修改為not null,將會使用很長時間。
發現加not null 可以使舊的資料不生效,只對新資料生效。即enable novalidate屬性.
2.實施過程:
 1)檢視錶結構
  SQL> desc t
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ---------------

 BATCH_ID                                  NOT NULL NUMBER(11)
 OUTPUT_ID                                          NUMBER(14)
 OUTFALL_TYPE                                       NUMBER(4)
 FLUX_VALUE                                         NUMBER(20,3)
 MEASURE_TIME                                       DATE
 IS_MEASURE                                         CHAR(1)
 FLUX_SUM                                           NUMBER(20,3)
 INSERT_TIME                                        DATE
 IS_VALIDATE                                        CHAR(1)
2)修改欄位is_validate為非空,只對新資料生效
SQL> alter table t modify is_validate not null enable novalidate;
表已更改。
已用時間:  00: 00: 00.85
3)更新表中為空的值
SQL> update t set is_validate=0 where is_validate is null;
已更新7766852行。
已用時間:  00: 30: 18.67
SQL> commit;
4)檢視約束狀態
SQL> select table_name,constraint_name,status,deferrable,deferred,validated from user_constraints where table_name='T';

TABLE_NAME                     CONSTRAINT_NAME                STATUS   DEFERRABLE     DEFERRED  VALIDATED
------------------------------ ------------------------------ -------- -------------- --------- -------------
T                  SYS_C005606                    ENABLED  NOT DEFERRABLE IMMEDIATE NOT VALIDATED

已用時間:  00: 00: 00.00

4)啟用約束
SQL> alter table t modify constraint sys_c005606 enable validate;
表已更改。

已用時間:  00: 02: 39.90

5)使trace跟蹤檢視兩者呼叫情況

alter session set events '10046 trace name context forever, level 12';

alter table t modify status not null enable novalidate;
alter session set events '10046 trace name context off';

alter session set events '10046 trace name context forever, level 12';

alter table t modify status not null;
alter session set events '10046 trace name context off';


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26937943/viewspace-1658903/,如需轉載,請註明出處,否則將追究法律責任。

相關文章