資料遷移判斷非空約束
在資料遷移中,經常會碰到null值的問題,比如在源庫中,某些列可能是null值,但是在目標庫中,卻有非空約束。這樣在資料的遷移過程中就會發生問題。
為了更好的對資料的非空問題進行判斷,我寫了如下的指令碼來生成檢查的指令碼,基本的思路就是生成動態sql,類似 select count(1) from xxx where xxx is null,如果輸出結果不為0,說明在源庫中存在著非空約束的問題。
指令碼需要在目標庫中生成,然後在源庫執行即可,可以在執行的過程中,考慮加入並行等。
因為非空約束的條件在user_constraints中式long型別卡所以不能做字串拼接等操作,就當做獨立的一列來處理。
sqlplus -s n1/n1 <
set linesize 150
set feedback off
set pages 0
col search_pre format a58
col search_condition format a50
spool not_null_constraint_$1.sql_tmp
select /*+rule*/
'select count(1) from ' || table_name || ' where ' search_pre,
search_condition, ';'
from user_constraints
where table_name =upper( '$1')
and constraint_type = 'C'
and constraint_name in
(select constraint_name
from user_cons_columns
where table_name = upper('$1')
and column_name in (select column_name
from user_tab_cols
where table_name =upper( '$1')
and nullable = 'N'));
spool off;
EOF
sed 's/ NOT / /g' not_null_constraint_$1.sql_tmp > not_null_constraint_$1.sql
rm not_null_constraint_$1.sql_tmp
exit
比如對於表T來說,object_id,object_name含有非空約束。
SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
OBJECT_ID NOT NULL NUMBER
OBJECT_NAME NOT NULL VARCHAR2(30)
OBJECT_TYPE VARCHAR2(19)
CLOB_TEST CLOB
執行指令碼後,生成的sql指令碼內容如下所示,達到了預期的目標。
select count(1) from T where "OBJECT_NAME" IS NULL ;
select count(1) from T where "OBJECT_ID" IS NULL ;
為了更好的對資料的非空問題進行判斷,我寫了如下的指令碼來生成檢查的指令碼,基本的思路就是生成動態sql,類似 select count(1) from xxx where xxx is null,如果輸出結果不為0,說明在源庫中存在著非空約束的問題。
指令碼需要在目標庫中生成,然後在源庫執行即可,可以在執行的過程中,考慮加入並行等。
因為非空約束的條件在user_constraints中式long型別卡所以不能做字串拼接等操作,就當做獨立的一列來處理。
sqlplus -s n1/n1 <
set feedback off
set pages 0
col search_pre format a58
col search_condition format a50
spool not_null_constraint_$1.sql_tmp
select /*+rule*/
'select count(1) from ' || table_name || ' where ' search_pre,
search_condition, ';'
from user_constraints
where table_name =upper( '$1')
and constraint_type = 'C'
and constraint_name in
(select constraint_name
from user_cons_columns
where table_name = upper('$1')
and column_name in (select column_name
from user_tab_cols
where table_name =upper( '$1')
and nullable = 'N'));
spool off;
EOF
sed 's/ NOT / /g' not_null_constraint_$1.sql_tmp > not_null_constraint_$1.sql
rm not_null_constraint_$1.sql_tmp
exit
比如對於表T來說,object_id,object_name含有非空約束。
SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
OBJECT_ID NOT NULL NUMBER
OBJECT_NAME NOT NULL VARCHAR2(30)
OBJECT_TYPE VARCHAR2(19)
CLOB_TEST CLOB
執行指令碼後,生成的sql指令碼內容如下所示,達到了預期的目標。
select count(1) from T where "OBJECT_NAME" IS NULL ;
select count(1) from T where "OBJECT_ID" IS NULL ;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347080/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【JAVA】判斷字串非空Java字串
- [20191206]nvl與非空約束.txt
- 資料遷移無法新增外來鍵約束,錯誤程式碼 1215
- 【python資料分析】判斷資料框是否為空Python
- MyBatis陣列與集合判斷非空和長度MyBatis陣列
- 判斷空值
- 判斷資料庫中表內資料為空的辦法資料庫
- Activiti判斷流程是否結束
- Javascript判斷空物件JavaScript物件
- 判斷 Eloqument 模型查詢資料結果是否為空模型
- mysql資料庫約束MySql資料庫
- 資料庫常用約束資料庫
- 2011-10-17 記錄型別判斷非空的辦法型別
- 判斷字串是否為空字串
- js空物件判斷 isPlainObjectJS物件AIObject
- Sql Server 自定義約束 實現:某列 可空,但非空值唯一不重複SQLServer
- 用傳輸表空間跨平臺遷移資料
- 資料型別與約束資料型別
- Harbor資料遷移
- gitlab資料遷移Gitlab
- 資料庫遷移資料庫
- Kafka資料遷移Kafka
- 震驚 PHP empty 函式判斷結果為空,但實際值卻為非空PHP函式
- Delphi Variant 判斷是否為空
- java判斷物件是否為空Java物件
- mysql如何判斷是否為空MySql
- js判斷字串是否為空JS字串
- java判斷字串是否為空Java字串
- JavaScript判斷字串是否為空JavaScript字串
- js判斷物件是否為空JS物件
- 移動端的判斷
- 達夢資料庫系統表空間資料檔案遷移過程資料庫
- 資料遷移(1)——通過資料泵表結構批量遷移
- 為什麼 php empty 函式判斷結果為空,但實際值卻為非空PHP函式
- 肯定賦值斷言與非空斷言賦值
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 系統資料遷移
- laravel資料庫遷移Laravel資料庫
- congregate遷移gitlab資料Gitlab