【INDEX】Oracle中主鍵、唯一約束與唯一索引之區別
一般在Oracle資料表中,我們都會看到主鍵,索引,也會看到唯一索引、唯一約束,那麼他們有什麼區別呢,下面透過一個小實驗簡單瞭解一下。
二、 實驗過程:
首先建立一個表,並完成主鍵、唯一約束、唯一索引的建立,如下所示:
SQL>--資料庫版本 BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi PL/SQL Release 10.2.0.5.0 - Production CORE 10.2.0.5.0 Production TNS for Linux: Version 10.2.0.5.0 - Production NLSRTL Version 10.2.0.5.0 – Production SQL> conn firsoul/firsoul Connected. SQL> --建立測試表 SQL> create table test (tno number(5),tname varchar2(20),tid int);
Table created. SQL>--新增主鍵 SQL> alter table test add constraint pk_test_tno primary key(tno);
Table altered. SQL>--新增唯一約束 SQL> alter table test add constraint uk_test_tname unique(tname);
Table altered. SQL>--新增唯一索引 SQL> create unique index idx_test_tid on test(tid);
Index created. |
向表TEST中插入資料,測試
SQL> insert into test values(1,'firsoul',123); 1 row created. SQL> 1 1* insert into test values(1,'firsoul',123) SQL> / insert into test values(1,'firsoul',123) * ERROR at line 1: ORA-00001: unique constraint (FIRSOUL.PK_TEST_TNO) violated
SQL> insert into test values(2,'firsoul',123456); insert into test values(2,'firsoul',123456) * ERROR at line 1: ORA-00001: unique constraint (FIRSOUL.UK_TEST_TNAME) violated
SQL> insert into test values(2,'ljx',123); insert into test values(2,'ljx',123) * ERROR at line 1:
ORA-00001: unique constraint (FIRSOUL.IDX_TEST_TID)
violated insert into test values(null,'ljx',124) * ERROR at line 1: ORA-01400: cannot insert NULL into ("FIRSOUL"."TEST"."TNO") SQL> insert into test values(2,null,null); 1 row created. SQL> commit; Commit complete. |
有以上資訊,我們可以看出主鍵列的值不允許為NULL,也不允許出現重複值,唯一約束、唯一索引列的值允許為NULL,但不允許出現重複值。
檢視字典表中約束的情況
SQL> set lines 150 SQL> col table_name for a15 SQL> col column_name for a15 SQL> col constraint_name for a20 SQL> select table_name,column_name,constraint_name from user_cons_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME CONSTRAINT_NAME --------------- --------------- -------------------- TEST TNO PK_TEST_TNO TEST TNAME UK_TEST_TNAME |
檢視字典表中索引的情況
SQL> select table_name,column_name,index_name from user_ind_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME INDEX_NAME --------------- --------------- ------------------------------ TEST TNO PK_TEST_TNO TEST TNAME UK_TEST_TNAME TEST TID IDX_TEST_TID
SQL> select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('test');
INDEX_NAME UNIQUENES TABLESPACE_NAME ------------------------------ --------- ------------------------------ IDX_TEST_TID UNIQUE FIRSOUL UK_TEST_TNAME UNIQUE FIRSOUL PK_TEST_TNO UNIQUE FIRSOUL |
在唯一索引上建立唯一約束,TID列增加了約束,並沒有繼續增加唯一索引。
SQL> alter table test add constraint uk_test_tid unique(tid);
Table altered.
SQL> set lines 150 SQL> col table_name for a15 SQL> col column_name for a15 SQL> col constraint_name for a20 SQL> select table_name,column_name,constraint_name from user_cons_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME CONSTRAINT_NAME --------------- --------------- -------------------- TEST TNO PK_TEST_TNO TEST TNAME UK_TEST_TNAME TEST TID UK_TEST_TID
SQL> select table_name,column_name,index_name from user_ind_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME INDEX_NAME --------------- --------------- ------------------------------ TEST TNO PK_TEST_TNO TEST TNAME UK_TEST_TNAME TEST TID IDX_TEST_TID |
透過上邊我們可以看出,建立主鍵、唯一約束時,會同時建立與約束一致名字的索引。
下面我們刪除唯一約束,檢視效果
SQL> alter table test drop constraint UK_TEST_TNAME;
Table altered.
SQL> alter table test drop constraint UK_TEST_TID;
Table altered.
SQL> select table_name,column_name,constraint_name from user_cons_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME CONSTRAINT_NAME --------------- --------------- -------------------- TEST TNO PK_TEST_TNO
SQL> select table_name,column_name,index_name from user_ind_columns where table_name=upper('test');
TABLE_NAME COLUMN_NAME INDEX_NAME --------------- --------------- ------------------------------ TEST TNO PK_TEST_TNO TEST TID IDX_TEST_TID |
透過上面結果我們可以得知,手動建立索引後再建立約束,刪除約束,不會刪除索引,建立約束自動建立的索引會在約束失效或刪除後自動刪除。
三、 總結
透過以上實驗我們可以知道
1、主鍵約束要求列值非空,而唯一鍵約束和唯一索引不要求列值非空,都不能有重複資料。
2、主鍵約束和唯一鍵約束會隱式建立同名的唯一索引,當主鍵約束或者唯一鍵約束失效時,隱式建立的唯一索引會被刪除。
3、相同欄位序列不允許重複建立索引。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1806063/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- Oracle主鍵、唯一鍵與唯一索引的區別Oracle索引
- 主鍵(PK)與非空唯一索引(Unique Index)的區別索引Index
- 主鍵、自增主鍵、主鍵索引、唯一索引概念區別與效能區別索引
- 唯一性約束和唯一性索引的區別索引
- 主鍵和唯一索引的區別索引
- ORACLE: 查詢(看)表的主鍵、外來鍵、唯一性約束和索引Oracle索引
- 查詢(看)表的主鍵、外來鍵、唯一性約束和索引索引
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- MYSQL中的普通索引,主健,唯一,全文索引區別MySql索引
- Oracle唯一約束中NULL的處理OracleNull
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(中)索引IndexORM
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- 唯一index和非唯一index中leaf node裡rowid的一點區別。Index
- 唯一索引和非唯一索引ROWID儲存的區別索引
- MySQL·捉蟲動態·唯一鍵約束失效MySql
- PostgreSQL唯一約束如何使用?SQL
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(上)索引IndexORM
- 唯一性索引(Unique Index)與普通索引(Normal Index)差異(下)索引IndexORM
- MongoDB之索引(唯一索引)MongoDB索引
- SQL Server唯一約束的使用SQLServer
- 建立Oracle唯一約束,忽略已有的重複值Oracle
- 建約束(Constraint)時隱式建立索引(Index)及先建立索引後建立約束的區別AI索引Index
- 【唯一】DISTINCT與UNIQUE的“區別”
- 關於唯一性索引造成堵塞和非唯一性索引造成堵塞的區別索引
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- 索引唯一性掃描(INDEX UNIQUE SCAN)索引Index
- 唯一索引索引
- 約束:確保資料的完整性(主鍵,唯一,檢查,預設,非空,外來鍵)
- indexedDB 索引與primarykey主鍵區別Index索引
- MySQL <唯一索引>MySql索引
- 主鍵,唯一性約束,不同session間未提交事務中的爭議性資料引起的問題。Session
- NULL和唯一約束UNIQUE的對應關係Null
- Elasticsearch之索引模板index template與索引別名index aliasElasticsearch索引Index
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- 如何解決邏輯刪除與資料庫唯一約束衝突資料庫
- oracle鍵約束控制Oracle
- Oracle定義約束 外來鍵約束Oracle