ORACLE中主鍵約束跟唯一索引之間的關聯關係

2022-04-09 08:43:33 字數 2033 閱讀 2144

在oracle中,可以在建立主鍵約束的時候自動建立唯一索引,也可以先建立唯一索引,然後再基於這個唯一索引來建立主鍵約束。後一種方式有乙個好處,在 需要對資料量比較大而且讀寫頻繁的oltp表建立主鍵約束的時候,可以先online的建立乙個唯一的索引,然後再建立主鍵約束,這樣可以減少對錶的讀寫 阻塞。但這樣就帶來乙個問題,第一種方式建立的索引在刪除約束的時候索引會被自動刪除,而第二種方式建立的索引在刪除約束的時候不會自動刪除,需要刪完約 束刪索引,如果忘記了這個唯一索引的話,可能會帶來跟想象不一樣的結果。同時,oracle針對這種情況提供了特殊的刪除約束的方法,可以同時刪除約束和 索引,就是:alter table bear drop constraint pk_bear drop index。在刪除約束的最後加上刪除索引的關鍵字。

但寫這一大堆都不是這裡要重點描述的內容,這裡要寫的是怎麼知道已經建立好的索引到底是第一種方式建立的?還是第二種方式建立的呢?

在oracle的sys.ind$檢視中有乙個叫property的字段,裡面記錄的就是每個索引對應的屬性,這個欄位的含義是在建立這個表的sql中有定義的。在10g的版本中,可以到$oracle_home/rdbms/admin/sql.bsp中查詢ind$表的建立指令碼;在11g的版本中,可以到相同的位置的dcore.bsp中查詢。這些指令碼都是建立系統核心表的指令碼,很多欄位在官方文件中沒有注釋的,可以來這裡找找看。在11g中對property欄位的注釋如下:

property number not null, /* immutable flags for life of the index */

/* unique : 0x01 */

/* partitioned : 0x02 */

/* reverse : 0x04 */

/* compressed : 0x08 */

/* functional : 0x10 */

/* temporary table index: 0x20 */

/* session-specific temporary table index: 0x40 */

/* index on embedded adt: 0x80 */

/* user said to check max length at runtime: 0x0100 */

/* domain index on iot: 0x0200 */

/* join index : 0x0400 */

/* system managed domain index : 0x0800 */

/* the index was created by a constraint : 0x1000 */

/* the index was created by create mv : 0x2000 */

/* composite domain index : 0x8000 */

這個是典型的oracle的表示方法,其中每個值表示乙個含義,但是多個值是可以累加起來表示多個含義的。比如乙個unique的reverse的索引,對應的值就會是0x05,property中對應的是10進製的存放,就應該也是5。

可以用下面的sql來查詢主鍵跟索引的關係是第一種還是第二種:

select decode(bitand(property, 4096), 4096, 'implicit', 'user-generated') generation,

b.index_name

from sys.ind$ a, user_indexes b, user_objects c

where b.uniqueness = 'unique'

and a.obj# = c.object_id

and b.index_name = c.object_name

and b.index_name = 'index_name';

上面的sql就是說如果property為4096,那麼對應到16進製制應該是0x1000,也就表示the index was created by a constraint,也就是第一種;其他都是第二種,這種情況下典型的值就是4097,也就是0x1000和0x01值的和。

摘自 小寶老豆的專欄

ORACLE 約束(主鍵 唯一鍵 )

一.主鍵約束 alter table add constraint primary key 1.外部定義 alter tablestudentadd constraintpk idprimary key st id 2.行級定義 create table student st id number 4...

oracle主鍵約束 唯一鍵約束和唯一索引的區別

1 主鍵約束和唯一鍵約束均會隱式建立同名的唯一索引,當主鍵約束或者唯一鍵約束失效時,隱式建立的唯一索引會被刪除 2 主鍵約束要求列值非空,而唯一鍵約束和唯一索引不要求列值非空 3 相同字段序列不允許重複建立索引 檢視約束名稱,約束型別 select constraint name,constrain...

mysql如何修改唯一性約束跟主鍵約束

一 如何新增主鍵約束和唯一性約束 1 新增主鍵約束 執行語法 alter table tablename add primarykey column name 千萬別忘了加 同時要保證表結構中沒有其他的主鍵,因為乙個表中只能有乙個主鍵。2 新增唯一性約束 執行語法 alter table table...