Oracle中主鍵約束跟唯一索引之間的關(guān)聯(lián)關(guān)系 |
發(fā)布時間: 2012/8/30 16:49:04 |
在Oracle中,可以在創(chuàng)建主鍵約束的時候自動創(chuàng)建唯一索引,也可以先創(chuàng)建唯一索引,然后再基于這個唯一索引來創(chuàng)建主鍵約束。后一種方式有一個好處,在 需要對數(shù)據(jù)量比較大而且讀寫頻繁的OLTP表創(chuàng)建主鍵約束的時候,可以先ONLINE的創(chuàng)建一個唯一的索引,然后再創(chuàng)建主鍵約束,這樣可以減少對表的讀寫 阻塞。但這樣就帶來一個問題,第一種方式創(chuàng)建的索引在刪除約束的時候索引會被自動刪除,而第二種方式創(chuàng)建的索引在刪除約束的時候不會自動刪除,需要刪完約 束刪索引,如果忘記了這個唯一索引的話,可能會帶來跟想象不一樣的結(jié)果。同時,Oracle針對這種情況提供了特殊的刪除約束的方法,可以同時刪除約束和 索引,就是:alter table bear drop constraint pk_bear drop index。在刪除約束的最后加上刪除索引的關(guān)鍵字。 但寫這一大堆都不是這里要重點描述的內(nèi)容,這里要寫的是怎么知道已經(jīng)創(chuàng)建好的索引到底是第一種方式創(chuàng)建的?還是第二種方式創(chuàng)建的呢? 在Oracle的SYS.IND$視圖中有一個叫PROPERTY的字段,里面記錄的就是每個索引對應(yīng)的屬性,這個字段的含義是在創(chuàng)建這個表的SQL中有定義的。在10G的版本中,可以到$Oracle_HOME/rdbms/admin/sql.bsp中查找ind$表的創(chuàng)建腳本;在11G的版本中,可以到相同的位置的dcore.bsp中查找。這些腳本都是創(chuàng)建系統(tǒng)核心表的腳本,很多字段在官方文檔中沒有注釋的,可以來這里找找看。在11G中對PROPERTY字段的注釋如下: property number not null, /* immutable flags for life of the index */ 這個是典型的Oracle的表示方法,其中每個值表示一個含義,但是多個值是可以累加起來表示多個含義的。比如一個UNIQUE的REVERSE的索引,對應(yīng)的值就會是0X05,PROPERTY中對應(yīng)的是10進制的存放,就應(yīng)該也是5。 可以用下面的SQL來查詢主鍵跟索引的關(guān)系是第一種還是第二種: 本文出自:億恩科技【www.cmtents.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |