由于在查詢中需要用到 UNION ALL 操作,而表中的存在 LONG 類型字段,操作無法完成,根據具體業務場景,將 LONG 類型字段修改為 CLOB 類型。修改后,UNION ALL 操作可行,但是子表的增刪改操作出現了問題,提示為父表的 INDEX 不可用。 這里順便說一句:如果
由于在查詢中需要用到 UNION ALL 操作,而表中的存在 LONG 類型字段,操作無法完成,根據具體業務場景,將 LONG 類型字段修改為 CLOB 類型。修改后,UNION ALL 操作可行,但是子表的增刪改操作出現了問題,提示為父表的 INDEX 不可用。
這里順便說一句:如果要從VARCHAR2類型修改為特殊類型CLOB,那么不能直接從VARCHAR2轉換為CLOB,需要使用LONG類型,來做一個過渡(可以先修改為LONG類型,然后從LONG修改為CLOB)。
–
解決方案:
1.同事前不久也遇到了這個問題,他的解決方案是:備份舊的表,刪除表,然后再導入數據,并且依然需要重建主鍵等。對沒有直接操作權限的ORCALE服務器恐怕有難度。所以這里歸根結底還是drop and re-create。
2.重建索引。oracle重建索引有多種方式,如 drop and re-create、rebuild、rebuild online等。這里采用的是第一種方式刪除創建。需要的一些腳本如下(TB_SCENERY是父表【景點表】,TB_SCENERY_TICKETS是子表【景點門票表】):
1.–查詢主外鍵,表名一定要大寫??
2.select constraint_name from user_constraints where table_name = ‘TB_SCENERY’;?? 3.select constraint_name from user_constraints where table_name = ‘TB_SCENERY_TICKETS’;?? 4.?
5.–刪除主外鍵,注意大小寫?? 6.alter table TB_SCENERY drop constraint SCENERY_PK_ID;?? 7.alter table TB_SCENERY_TICKETS drop constraint SCENERY_ID;?? 8.?
9.–增加主鍵(增加主鍵時會自動建立關于主鍵的索引)?? 10.alter table TB_SCENERY add constraint SCENERY_PK_ID primary key (ID) ;??? 11.?
12.–增加外鍵?? 13.alter table TB_SCENERY_TICKETS add constraint SCENERY_PK_ID foreign key (SCENERY_ID)? references TB_SCENERY (ID);?? 14.?
15.–查詢表的相關索引?? 16.select index_name,index_type,table_name from user_indexes where table_name=’TB_SCENERY’;?? 17.?
18.–刪除索引[強制]?? 19.DROP INDEX SCENERY_PK_ID [FORCE];?? 20.?
21.–查詢哪些表沒有建立索引?? 22.SELECT table_name FROM User_tables t? WHERE NOT EXISTS (SELECT table_name FROM User_constraints c WHERE constraint_type = ‘P’ AND t.table_name=c.table_name)? 這里的步驟是:
1.查詢子表的外鍵名稱,刪除對應的外鍵,以及外鍵對應的索引
2.查詢主表的主鍵名稱,刪除對應的主鍵,以及主鍵對應的索引
3.建立主表主鍵(主鍵索引會自動建立),建立子表外鍵,建立外鍵索引
3.drop and re-create 方式的有點是速度快,缺點是會影響原有的SQL查詢,如果考慮這個影響那就可以采用rebuild的方式(IDX_TEST_C1這是索引名稱):
ALTER INDEX IDX_TEST_C1 REBUILD;??
其實開始是嘗試的是rebuild的方式,但是失敗了,無可奈何只能采用drop and re-create 方式。