區別:1、主鍵是一種約束,唯一索引是一種索引。2、主鍵創建后一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。3、唯一性索引列允許空值,而主鍵列不允許為空值。4、主鍵可以被其他表引用為外鍵,而唯一索引不能。
本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。
主鍵索引和唯一索引的區別
-
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
-
主鍵創建后一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。
-
唯一性索引列允許空值,而主鍵列不允許為空值。
-
主鍵列在創建時,已經默認為空值 + 唯一索引了。
-
主鍵可以被其他表引用為外鍵,而唯一索引不能。
-
一個表最多只能創建一個主鍵,但可以創建多個唯一索引。
-
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
-
在 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