遷移後處理外來鍵約束的問題
資料導導新的測試庫後,因為在impdp的時候沒有表的順序,這裡會造成新測試庫上面的所有表都沒有了外來鍵約束,或者是約束有錯誤
update globalidentity set identityvalue=identityvalue+100000;
--必須在當前使用者執行
select USERENV ('SCHEMAID') from dual;--66
--dba使用者執行
update sys.seq$ set highwater=highwater+10000 where obj# in
(select obj# from sys.obj$ where owner#=66)
1 約束問題
下面是要去掉自己表列裡面有外來鍵約束卻沒有被約束到的資料,直接刪除,用拼湊字串的方式生成所需要的SQL來刪除
select 'delete ' || c.table_name|| ' where ' || d.column_name || '>(select max('||
b.column_name || ') from ' || a.table_name|| ');'
from user_constraints a,user_cons_columns b,user_constraints C,user_cons_columns d
where a.constraint_name=b.constraint_name
and c.R_CONSTRAINT_NAME=a.constraint_name
and c.constraint_name=d.constraint_name
and a.constraint_type='P'
2 檢視要刪除的表當了多少表的‘部門’
select a.owner 主鍵擁有者,
a.table_name 主鍵表,
b.column_name 主鍵列,
C.OWNER 外來鍵擁有者,
c.table_name 外來鍵表,
d.column_name 外來鍵列
from user_constraints a,
user_cons_columns b,
user_constraints C,
user_cons_columns d
where a.constraint_name=b.constraint_name
and C.R_CONSTRAINT_NAME=a.constraint_name
and c.constraint_name=d.constraint_name
and a.constraint_type='P'
and a.table_name='T_TO_ORDER_INFO' --需要檢視主外來鍵關係的表
order by a.table_name
到時候級聯刪除的時候,下面只要有外來鍵約束到了這張表上面的,那麼刪除的時候下面的表對應的都會被刪除
3 將表的約束改為直接級聯刪除的
先刪除原來的外來鍵約束(刪除前要把下面的SQL先執行出來)
select 'alter table '||a.table_name||' drop constraint '||c.constraint_name||';'
from
user_constraints a,
user_constraints b,
user_cons_columns c,
user_cons_columns d
where
a.r_constraint_name=b.constraint_name
and a.constraint_type='R'
and b.constraint_type='P'
and a.r_owner=b.owner
and a.constraint_name=c.constraint_name
and b.constraint_name=d.constraint_name
and a.owner=c.owner
and a.table_name=c.table_name
and b.owner=d.owner
and b.table_name=d.table_name
============================================================================
再重新新增約束,新增的時候加上級聯刪除(執行的時候要先出它的SQL,再出上面的SQL)
select 'alter table '||a.table_name||' add constraint '|| c.constraint_name||
' foreign key('||c.column_name||') references '||b.table_name||'('||d.column_name||') on delete cascade;'
from
user_constraints a,
user_constraints b,
user_cons_columns c,
user_cons_columns d
where
a.r_constraint_name=b.constraint_name
and a.constraint_type='R'
and b.constraint_type='P'
and a.r_owner=b.owner
and a.constraint_name=c.constraint_name
and b.constraint_name=d.constraint_name
and a.owner=c.owner
and a.table_name=c.table_name
and b.owner=d.owner
and b.table_name=d.table_name
上面會生成2排的SQL,先執行刪除約束的SQL,再建立級聯刪除的SQL,這樣,後面就可以進行級聯刪除了
4 分段刪除
因為刪除的表太大了,只能改為1000行1000行的刪
delete T_TO_ORDER_INFO WHERE ORDER_ID min(order_id)+1000 from T_TO_ORDER_INFO);
COMMIT;
delete T_TO_ORDER_INFO WHERE ORDER_ID min(order_id)+1000 from T_TO_ORDER_INFO);
COMMIT;
這麼執行一條語句,那麼由步驟2執行出來的關聯的表對應的列都被刪除了,如果步驟2出來的有15張表,那麼刪一行資料就會刪的15張所對應的每一個資料行上面
今天看了一下,級聯刪除1000條要用20分鐘,這麼算下來要刪掉一張表要用800小時
上面這種方法行不通,那麼只能一層一層手動刪除,將步驟2用in的方式巢狀一次,發現17張表下面還有6張表,再看看6張表下面有沒有東西,如果沒有,就直接truncate掉,然後再來truncate那17張,但是又發現有外來鍵關係的,雖然子表沒有資料了,但是仍然不能用truncate,不這種delete就快多了
備註:一張由資料,索引,約束,備註等東西組成,我們仍然可以通過上面步驟2的方式找出那顆樹從根到葉的所有表,然後直接drop,用指令碼建立表,用上面步驟3的方式重建約束
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10678398/viewspace-693980/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 外來鍵約束
- Javaweb-約束-外來鍵約束JavaWeb
- 資料遷移無法新增外來鍵約束,錯誤程式碼 1215
- 關於外來鍵約束
- 約束外來鍵筆記筆記
- oracle外來鍵約束的總結Oracle
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- 教你mysql如何增加外來鍵約束MySql
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- SQL外來鍵約束的含義及建立SQL
- Oracle impdp遷移資料後主鍵丟失故障處理Oracle
- mysql不能新增外來鍵約束怎麼辦MySql
- mysql~資料完整性考慮~外來鍵約束MySql
- 約束和異常處理
- 聊聊Oracle外來鍵約束(Foreign Key)的幾個操作選項Oracle
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- X7一體機資料庫遷移問題處理資料庫
- docker 遷移映象到其他機器執行報錯OCI 問題處理Docker
- 如果新增欄位是外來鍵,如何處理?
- MariaDB資料庫的外來鍵約束例項程式碼介紹詳解資料庫
- 批量刪除MSSQL 中主外來鍵約束SQL
- 教程:使用遷移學習來解決影像問題!遷移學習
- xtts遷移時ORA-353處理TTS
- 主鍵約束、唯一約束和唯一索引索引
- 關於 Laravel 遷移遇到的問題Laravel
- 遷移學習中的BN問題遷移學習
- 對Oracle分割槽表進行表空間遷移並處理ORA-14511問題Oracle
- [資料庫]資料庫中為什麼不推薦使用外來鍵約束資料庫
- 【MySQL】MySQL進階(外來鍵約束、多表查詢、檢視、備份與恢復)MySql
- Laravel 學習總結二:get () 和 first () 的區別、@each () 的用法和新增外來鍵約束Laravel
- EntityFramework Core 遷移忽略主外來鍵關係Framework
- 自然語言處理中的遷移學習(下)自然語言處理遷移學習
- 自然語言處理中的遷移學習(上)自然語言處理遷移學習
- [20190218]延遲約束問題2.txt
- 遷移Qt專案的路徑問題QT
- Entity Framework 實體載入外來鍵屬性的問題Framework
- 《資料庫系統概論》5.0——常見約束 大學生學習筆記(主鍵 外來鍵)資料庫筆記
- [20180423]關於閃回表與主外來鍵約束.txt
- Mysql關於資料庫是否應該使用外來鍵約束詳解說明創磅MySql資料庫