在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...