oracle 主鍵索引重建 索引包含的列為空

2021-10-09 01:12:09 字數 1639 閱讀 4645

有一次oracle插入資料衝突,需要刪除舊資料再重新插入。

現在根據索引名稱(index_name)和使用者名稱(index_owner)即可找到主鍵包含的列。

但是在想要根據主鍵刪除舊的行資料時發現查不到主鍵索引所包含的列名。

select column_name from dba_ind_columns where index_name = 'sys_c0083355' and index_owner = 'ceshi'
就上面這一條語句正常來說應該顯示主鍵所包含的列,如下圖

但是我的查詢結果卻是null,這就導致想要找到主鍵包含的列不成功。

但是在執行下面這條語句時約束名sys_c0083355是確實存在的,而且這個約束確實屬於這個表。

結果中有sys_c0083355,也就是說這個此索引存在但是沒有包含任何列或者約束存在但是約束對應的這個索引不存在。

刪除原有的主鍵所含列的索引和主鍵,重新為這個表建立主鍵,此時就會恢復正常。

語句如下:

alter table 使用者名稱.表名 drop constraint sys_c0083355(約束名);

drop index 索引名;

alter table 使用者名稱.表名 add primary key(欄位1,欄位2);

經過測試發現,如果先為某乙個字段建立索引,然後再把它設定為主鍵,就會出現這種情況。但是先設定主鍵再去給這個字段設定索引則會報錯:ora-01408: 此列列表已索引,說明乙個列組合應該只允許有乙個索引。

唯一索引不允許出現重複值,主鍵索引不僅不允許重複值而且不允許出現null。

圖中可以看到把id列約束成了主鍵,而主鍵是唯一的,所以這個約束也應該是唯一的,建立唯一約束的同時會自動建立唯一索引。所以猜測上文的錯誤是因為手動設定索引在前,設定主鍵在後,導致因設定主鍵而預設生成的這個約束發現該欄位已經有了索引,於是這個約束就不能再去新建索引。而我**中的index_name只是剛好和約束名同名而已,約束存在,索引不存在。

1.建表,不要設定主鍵。

2.為表中某一欄位建立索引。

3.把上一步的字段設為主鍵。

4.執行  

select * from sys.dba_constraints where table_name='ac(表名)'

可以看到constraint_name欄位,即索引的名字。

5.執行

select * from dba_ind_columns where index_owner = 'ceshi(使用者名稱)'

and  index_name='sys_c0083355(索引名)'

6.看到結果中表名為ac的行中column_name這一列為空

Oracle重建索引

如果表更新比較頻繁,那麼在索引中刪除標示會越來越多,這時索引的查詢效率必然降低,所以我們應該定期重建索引來消除索引中這些刪除標記。一般不會選擇先刪除索引,然後再重新建立索引,而是rebuild索引。在rebuild期間,使用者還可以使用原來的索引,並且rebuild新的索引時也會利用原來的索引資訊,...

ORACLE 索引批量重建

按使用者批量重建索引 按使用者將此使用者下面非臨時表上面的索引全部重建,此過程建議在 sys使用者下面執行 create or replace procedure batch rebuild index user name in varchar2 is s sql varchar2 500 acco...

mysql非主鍵索引 主鍵索引和非主鍵索引的區別

1.什麼是最左字首原則?以下回答全部是基於mysql的innodb引擎 例如對於下面這一張表 如果我們按照 name 欄位來建立索引的話,採用b 樹的結構,大概的索引結構如下 如果我們要進行模糊查詢,查詢name 以 張 開頭的所有人的id,即 sql 語句為 select id from tabl...