表中已有資料,將表中某個欄位為空的改為非空
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跟蹤檢視兩者呼叫情況
表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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- hive將查詢資料插入表中某欄位無資料Hive
- 改變表中非空欄位的型別型別
- 如何查詢某個資料表中除某個欄位的所有資訊???
- 將表空間test1中的資料全部遷移到表空間test2中
- 將字典管理表空間轉換為本地管理表空間
- 獲取SQL資料庫中某個表中的所有欄位名稱的通用方法SQL資料庫
- MySQL-取某個欄位表中每組幾行資料方式MySql
- Java判斷欄位是否為空,為空賦值 ?Java賦值
- [zt] 如何將資料字典管理表空間(DMT)轉化為本地管理表空間(LMT)
- MySQL中修改一個資料庫下包含有某個相同欄位的所有表的欄位長度MySql資料庫
- 更新大表中某個欄位的儲存過程儲存過程
- 怎樣獲得資料表中某個欄位的第二個最大值
- 查詢mysql某張表中的所有資料(欄位)型別MySql型別
- oracle檢視該使用者的所有表名字、表註釋、欄位名、欄位註釋、是否為空、欄位型別Oracle型別
- lob欄位表空間遷移
- 遷移帶LOB等大欄位資料到非預設表空間
- 向資料庫中全部表中增加一個欄位的SQL資料庫SQL
- 如何為asm db中system表空間的資料檔案使用別名!ASM
- 將表從一個表空間遷移到另外一個表空間
- 【GP】透過資料字典檢視某個表的欄位
- 遷移SYSTEM表空間為本地管理表空間
- 改變資料庫undo表空間資料庫
- IMPDP 多個表空間物件匯入到一個表空間中物件
- mysql資料表按照某個欄位分類輸出MySql
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- 支援 enum 型別的欄位允許為空插入資料庫型別資料庫
- MySQL 更新一個表裡的欄位等於另一個表某欄位的值MySql
- js判斷欄位是否為空 isNullJSNull
- 在Oracle 中查詢某個欄位存在於哪幾個表 (轉)Oracle
- 動態為10g資料庫的表新增欄位,到256個欄位,hung住了?資料庫
- vue中當資料為空時的處理Vue
- 水煮orale22——查詢表空間使用資訊以及表空間中的每個資料檔案資訊
- 某個表空間的資料檔案損壞的修復思路
- 如何找到某個 ABAP structure 某欄位的源頭來自哪個資料庫表Struct資料庫
- jq 將form表單中的資料轉為jsonORMJSON
- sql去除某個欄位中的某個字串 replaceSQL字串
- 觸發器—一個表更新資料時同步欄位到另一個表中觸發器