解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引
根據Oracle的AWR、ADDM發現的一個SQL語句:
SQL語句:
select distinct m.*
from ING_mmee_info m
start with m.mmee_id in
(select distinct m.mmee_id
from ING_PERSON_EMPLOYEE h,
ING_PERSON_ROLE r,
ING_mmee_info m,
ING_PERSON_ROLE_ASGMT hr,
ING_role_mmee rm
where h.employee_id = hr.EMPLOYEE_ID
and hr.role_id = r.role_id
and r.role_id = rm.role_id
and rm.mmee_id = m.mmee_id
and m.bsflag = '0'
and h.employee_id = '89474644FEDE10A8E0430A15081210A8'
and r.locked_if = '0'
and sysdate between rm.start_date and
rm.start_date + rm.valid_dates
union (select distinct m.mmee_id
from ING_PERSON_EMPLOYEE h,
ING_PERSON_POSITION p,
ING_PERSON_ROLE r,
ING_mmee_info m,
ING_PERSON_POSITION_ASGMT hp,
ING_POSITION_ROLE_ASGMT pr,
ING_role_mmee rm
where h.employee_id = hp.EMPLOYEE_ID
and hp.POSITION_ID = p.POSITION_CODE_ID
and p.POSITION_CODE_ID = pr.position_id
and pr.role_id = r.role_id
and r.role_id = rm.role_id
and rm.mmee_id = m.mmee_id
and h.employee_id = '89474644FEDE10A8E0430A15081210A8'
and p.locked_if = '0'
and r.locked_if = '0'
and m.bsflag = '0'
and sysdate between rm.start_date and
rm.start_date + rm.valid_dates)
union (select distinct m.mmee_id
from ING_PERSON_EMPLOYEE h,
ING_PERSON_mmee hm,
ING_mmee_info m
where hm.mmee_id = m.mmee_id
and hm.employee_id = h.employee_id
and m.bsflag = '0'
and h.employee_id = '89474644FEDE10A8E0430A15081210A8'
and sysdate between hm.start_date and
hm.start_date + hm.valid_dates))
connect by prior m.upmmee_id = m.mmee_id
order by m.mmee_order, m.mmee_id
在PLSQL Developer中檢視該SQL的執行計劃:
結果顯示兩個個亂碼:
檢視亂碼索引的表:
select * from user_indexes t
where t.table_name in(
'ING_PERSON_EMPLOYEE',
'ING_PERSON_ROLE',
'ING_mmee_INFO',
'ING_PERSON_ROLE_ASGMT',
'ING_ROLE_mmee',
'ING_PERSON_POSITION',
'ING_PERSON_POSITION_ASGMT',
'ING_POSITION_ROLE_ASGMT'
)
根據檢視結果,下面的2個表的主鍵索引存在亂碼。
ING_PERSON_POSITION和ING_PERSON_POSITION_ASGMT 有亂碼
這兩個表的主鍵約束為中文字元,在遷移資料時很容易出現對應的索引亂碼。
1、這個ING_PERSON_POSITION_ASGMT表的主鍵沒有對應其他表的外來鍵:
下面的方法解決:
刪除主鍵及對應索引:
ALTER TABLE ING_PERSON_POSITION_ASGMT drop CONSTRAINT XPK人員崗位分配表 drop index
建立主鍵:
ALTER TABLE ING_PERSON_POSITION_ASGMT add CONSTRAINT PK_POSITION_ASGMT_ID PRIMARY KEY (POSITION_ASGMT_ID);
2、ING_PERSON_POSITION有其他表對應的外來鍵。
--1 查詢主鍵名所對應 其他表的外來鍵:
select * from user_constraints t
where t.r_constraint_name='XPK崗位資訊表'
對應的外來鍵的表 ING_PERSON_POSITION_MAP ,外來鍵約束名: FK_ING_PERSON_POSITION_MAP2
--2 刪除外來鍵約束
alter table ING_PERSON_POSITION_MAP
drop constraint FK_ING_PERSON_POSITION_MAP2
--3 刪除主鍵及其索引
ALTER TABLE ING_PERSON_POSITION drop CONSTRAINT XPK崗位資訊表 drop index
--4 增加主鍵
ALTER TABLE ING_PERSON_POSITION add CONSTRAINT PK_POSITION_CODE_ID PRIMARY KEY (POSITION_CODE_ID);
--5 增加外來鍵
alter table ING_PERSON_POSITION_MAP
add constraint FK_ING_PERSON_POSITION_MAP2 foreign key (DEVICE_REC_ID)
references ING_PERSON_POSITION (POSITION_CODE_ID);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12778571/viewspace-694789/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- 批量刪除MSSQL 中主外來鍵約束SQL
- mysql 刪除老是報外來鍵約束MySql
- 解決無法刪除表,提示被外來鍵約束引用
- mysql中外來鍵約束級聯更新與刪除MySql
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- mysql資料庫匯入外來鍵約束問題MySql資料庫
- mysql刪除主鍵索引,刪除索引語法MySql索引
- Javaweb-約束-外來鍵約束JavaWeb
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- SQL的主鍵和外來鍵約束SQL
- 查詢(看)表的主鍵、外來鍵、唯一性約束和索引索引
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- Oracle定義約束 外來鍵約束Oracle
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- 新增/刪除約束(Oracle)Oracle
- ORACLE: 查詢(看)表的主鍵、外來鍵、唯一性約束和索引Oracle索引
- 利用函式索引解決複雜的約束問題函式索引
- 分散式資料庫環境中,外來鍵約束的問題??分散式資料庫
- 利用虛擬列實現虛擬刪除的主外來鍵約束
- 【Foreign Key】Oracle外來鍵約束三種刪除行為Oracle
- [求助][資料庫]表間約束的刪除完整性?資料庫
- Oracle刪除主鍵保留索引的方法Oracle索引
- 刪除或清空具有外來鍵約束的表資料包-ERROR 1701 (42000)Error
- 建約束(Constraint)時隱式建立索引(Index)及先建立索引後建立約束的區別AI索引Index
- 【INDEX】Oracle中主鍵、唯一約束與唯一索引之區別IndexOracle索引
- 遷移後處理外來鍵約束的問題
- 如何解決邏輯刪除與資料庫唯一約束衝突資料庫
- Activiti刪除外來鍵
- oracle鍵約束控制Oracle
- MariaDB資料庫的外來鍵約束例項程式碼介紹詳解資料庫
- oracle外來鍵約束的總結Oracle
- 關於外來鍵約束和對應主鍵資訊的查詢指令碼指令碼
- SQL Server實戰三:資料庫表完整性約束及索引、檢視的建立、編輯與刪除SQLServer資料庫索引
- 詳解外來鍵約束(foreign key)
- 教你mysql如何增加外來鍵約束MySql