主鍵和唯一索引的區別
—?區別
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵創建后一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在創建時,已經默認為空值 + 唯一索引了。
主鍵可以被其他表引用為外鍵,而唯一索引不能。
一個表最多只能創建一個主鍵,但可以創建多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
在 RBO 模式下,主鍵的執行計劃優先級要高于唯一索引。 兩者可以提高查詢的速度。
—?創建一張僅包含主鍵和唯一索引的表
CREATE?TABLE?test (PrimaryKey?VARCHAR2(20), ??UniqueKey??VARCHAR2(20) );
—?分別創建主鍵和唯一索引,語法不同
ALTER?TABLE?test?ADD?CONSTRAINT?test_PrimaryKey?PRIMARY?KEY?(PrimaryKey); CREATE?UNIQUE?INDEX?test_UniqueKey?ON?test?(UniqueKey);
—?在?USER_INDEXES?中可以看到兩個索引名稱
SELECT?table_name,table_type,index_name,index_type,uniqueness ??FROM?USER_INDEXES ??WHERE?TABLE_NAME='TEST';
?
—?在?USER_IND_COLUMNS?中可以看到兩個索引字段名稱
SELECT?table_name,index_name,column_name,column_position ??FROM?USER_IND_COLUMNS ??WHERE?TABLE_NAME='TEST';
?
—?在?USER_CONSTRAINTS?僅可以看到主鍵約束名稱
SELECT?table_name,constraint_name,constraint_type ??FROM?USER_CONSTRAINTS ??WHERE?TABLE_NAME='TEST';
?
—?在?USER_CONS_COLUMNS?僅可以看到主鍵約束字段名稱
SELECT?table_name,constraint_name,column_name,position ??FROM?USER_CONS_COLUMNS ??WHERE?CONSTRAINT_NAME?IN?(SELECT?CONSTRAINT_NAME?????????????????????????? ???FROM?USER_CONSTRAINTS???????????????????????????? ???WHERE?TABLE_NAME='TEST');
?—?為唯一索引增加一個非空約束
ALTER?TABLE?test?MODIFY?UniqueKey?NOT?NULL;
?—?在?USER_CONSTRAINTS?僅可以看到主鍵約束名稱和非空約束名稱
SELECT?table_name,constraint_name,constraint_type
??FROM?USER_CONSTRAINTS ??WHERE?TABLE_NAME='TEST'
?
—?在?USER_CONS_COLUMNS?僅可以看到主鍵約束字段名稱和非空約束字段名稱
SELECT?table_name,constraint_name,column_name,position ??FROM?USER_CONS_COLUMNS ??WHERE?CONSTRAINT_NAME?IN?(SELECT?CONSTRAINT_NAME????????????????????????????? ??FROM?USER_CONSTRAINTS???????????????????????????? ??WHERE?TABLE_NAME='TEST')
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END