解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引
根據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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 主鍵約束、唯一約束和唯一索引索引
- 批量刪除MSSQL 中主外來鍵約束SQL
- mysql刪除主鍵索引,刪除索引語法MySql索引
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- Javaweb-約束-外來鍵約束JavaWeb
- 外來鍵約束
- MariaDB資料庫的外來鍵約束例項程式碼介紹詳解資料庫
- 如何解決邏輯刪除與資料庫唯一約束衝突資料庫
- 關於外來鍵約束
- 約束外來鍵筆記筆記
- Activiti刪除外來鍵
- SQL Server實戰三:資料庫表完整性約束及索引、檢視的建立、編輯與刪除SQLServer資料庫索引
- oracle外來鍵約束的總結Oracle
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- 教你mysql如何增加外來鍵約束MySql
- mysql~資料完整性考慮~外來鍵約束MySql
- [資料庫]資料庫中為什麼不推薦使用外來鍵約束資料庫
- 資料庫常用約束資料庫
- mysql資料庫約束MySql資料庫
- 《資料庫系統概論》5.0——常見約束 大學生學習筆記(主鍵 外來鍵)資料庫筆記
- SQL外來鍵約束的含義及建立SQL
- Oracle如何管理帶約束的B樹索引Oracle索引
- 用函式索引構造特殊的約束函式索引
- MySQL——表的約束,資料型別,增刪查改MySql資料型別
- Sqlserver中所有約束的型別,建立、修改與刪除SQLServer型別
- 資料遷移無法新增外來鍵約束,錯誤程式碼 1215
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- mysql不能新增外來鍵約束怎麼辦MySql
- MyBatisPlus解決邏輯刪除與唯一索引的相容問題MyBatis索引
- Mysql關於資料庫是否應該使用外來鍵約束詳解說明創磅MySql資料庫
- 資料庫——一些復健(主要是約束和索引相關練習)資料庫索引
- Linux下使用Vi時方向鍵變亂碼、刪除鍵不能使用的解決方法Linux
- Sql server 檢視錶引用、依賴項,刪除表及約束 指令碼SQLServer指令碼
- [20210520]關於主鍵索引問題.txt索引
- [20180423]關於閃回表與主外來鍵約束.txt
- 指定刪除幾天前的索引資料索引
- ORACLE批量刪除無主鍵重複資料Oracle