1. 程式人生 > >主鍵、唯一鍵與唯一索引的區別

主鍵、唯一鍵與唯一索引的區別

一般,我們看到術語“索引”和“鍵”交換使用,但實際上這兩個是不同的。索引是儲存在資料庫中的一個物理結構,鍵純粹是一個邏輯概念。鍵代表建立來實施業務規則的完整性約束。索引和鍵的混淆通常是由於資料庫使用索引來實施完整性約束。

接下來我們看看資料庫中的主鍵約束、唯一鍵約束和唯一索引的區別。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> create table test (          

  2  id int,

  3  name varchar2(20),

  4  constraint pk_test primary key(id))

  5  tablespace users;

Table created.

SQL> select constraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME                C

------------------------------ -

PK_TEST                        P

在test表中,我們指定了ID列作為主鍵,Oracle資料庫會自動建立一個同名的唯一索引:

SQL> select index_name, index_type, uniqueness, tablespace_name

  2  from user_indexes

  3  where table_owner='SCOTT'

  4  and table_name = 'TEST';

INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

-------------------- -------------------- --------- ------------------------------

PK_TEST              NORMAL               UNIQUE    USERS

此時,如果我們再試圖在ID列上建立一個唯一索引,Oracle會報錯,因為該列上已經存在一個唯一索引:

SQL> create unique index idx_test_uk on test(id);

create unique index idx_test_uk on test(id)

                                        *

ERROR at line 1:

ORA-01408: such column list already indexed

即使建立非唯一索引也不行:

SQL> create index idx_test_id on test(id);

create index idx_test_id on test(id)

                                 *

ERROR at line 1:

ORA-01408: such column list already indexed

那麼唯一鍵約束的情況是怎樣的呢?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

  2  id int,

  3  name varchar2(20),

  4  constraint uk_test unique(id));

Table created.

SQL> select constraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME                C

------------------------------ -

UK_TEST                        U

檢視此時的索引情況:

SQL> select index_name, index_type, uniqueness, tablespace_name

  2  from user_indexes

  3  where table_owner='SCOTT'

  4  and table_name = 'TEST';

INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

-------------------- -------------------- --------- ------------------------------

UK_TEST              NORMAL               UNIQUE    USERS

Oracle同樣自動建立了一個同名的唯一索引,而且也不允許再在此列上建立唯一索引或非唯一索引。

我們知道,主鍵約束要求列值非空(NOT NULL),那麼唯一鍵約束是否也要求非空呢?

SQL> insert into test values(1, 'Sally');

1 row created.

SQL> insert into test values(null, 'Tony');

1 row created.

SQL> insert into test values(null, 'Jack');

1 row created.

SQL> select * from test;

        ID NAME

---------- --------------------

         1 Sally

           Tony

           Jack

從實驗結果來看,唯一鍵約束並沒有非空要求。

接下來我們看看唯一索引對列值的非空要求有什麼不同。

SQL> drop table test purge;

Table dropped.

SQL> create table test(

  2  id int,

  3  name varchar2(20));

Table created.

SQL> create unique index idx_test_id on test (id);

Index created.

SQL> insert into test values(1, 'Sally');

1 row created.

SQL> insert into test values(null, 'Tony');

1 row created.

SQL> insert into test values(null, 'Jack');

1 row created.

SQL> select * from test;

        ID NAME

---------- --------------------

         1 Sally

           Tony

           Jack

通過實驗,我們看出唯一索引與唯一鍵約束一樣對列值非空不做要求。

如果我們讓主鍵約束或者唯一鍵約束失效,Oracle自動建立的唯一索引是否會受到影響?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

  2  id int,

  3  name varchar2(20),

  4  constraint uk_test unique(id));

Table created.

SQL> select index_name, index_type, uniqueness from user_indexes;

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

UK_TEST                        NORMAL                      UNIQUE

SQL> alter table test disable constraint uk_test;

Table altered.

SQL> select index_name, index_type, uniqueness from user_indexes;

no rows selected

當主鍵約束或者唯一鍵約束失效時,Oracle會刪除隱式建立的唯一索引。

如果我們先建立唯一索引,再建立主鍵或者唯一鍵約束,情況又會怎樣呢?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

  2  id int,

  3  name varchar2(20));

Table created.

SQL> create unique index idx_test_id on test (id);

Index created.

SQL> select index_name, index_type, uniqueness

  2  from user_indexes

  3  where table_owner = 'SCOTT'

  4  and table_name = 'TEST';

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

IDX_TEST_ID                    NORMAL                      UNIQUE

SQL> alter table test add constraint uk_test unique (id);

Table altered.

SQL> select index_name, index_type, uniqueness

  2  from user_indexes

  3  where table_owner = 'SCOTT'

  4  and table_name = 'TEST';

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

IDX_TEST_ID                    NORMAL                      UNIQUE

SQL> select constraint_name, constraint_type

  2  from user_constraints

  3  where table_name = 'TEST';

CONSTRAINT_NAME                C

------------------------------ -

UK_TEST                        U

SQL> alter table test disable constraint uk_test;

Table altered.

SQL> select constraint_name, constraint_type, status

  2  from user_constraints

  3  where table_name = 'TEST';

CONSTRAINT_NAME                C STATUS

------------------------------ - --------

UK_TEST                        U DISABLED

SQL> select index_name, index_type, uniqueness, status

  2  from user_indexes

  3  where table_owner = 'SCOTT'

  4  and table_name = 'TEST';

INDEX_NAME                     INDEX_TYPE                  UNIQUENES STATUS

------------------------------ --------------------------- --------- --------

IDX_TEST_ID                    NORMAL                      UNIQUE    VALID

實驗結果表明,先建立的唯一索引不受約束失效的影響。

總結如下:

(1)主鍵約束和唯一鍵約束均會隱式建立同名的唯一索引,當主鍵約束或者唯一鍵約束失效時,隱式建立的唯一索引會被刪除;

(2)主鍵約束要求列值非空,而唯一鍵約束和唯一索引不要求列值非空;

(3)相同欄位序列不允許重複建立索引;

相關推薦

數據表操作唯一使用

MySQL表操作 MySQL主鍵使用 MySQL外鍵操作 MySQL唯一鍵使用 1、修改數據庫(比如修改字符集)mysql> alter database `DB` character set utf8;2、根據查詢結果建立數據表,註意這樣復制的數據表是不能將主鍵也復制過來的,也就是說此

Oracle 獲取表的以及唯一約束條件

pre columns etl pan nbsp name col 擁有 bsp Oracle 獲取表的主鍵、外鍵以及唯一約束條件 Select a.Owner 主鍵擁有者,     a.table_name 主鍵表,     b.Column_Name 主鍵列

Mysql索引區別

post 標識 mysq 個數 字段 一個 區別 允許 mysql 定義主鍵--唯一標識一條記錄,不能有重復的,不允許為空外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值索引--該字段沒有重復值,但可以有一個空值 作用主鍵--用來保證數據完整性外鍵--

mysql數據庫基礎(2)索引復合

刪除表 工資 adb birt column 參考 ext 賦值 var 增、刪、改、查 加“”表示為普通字符 mysql> insert into t9 values("NULL",21,"game,flim"); ++++++++++++++++++++++++

mysql資料庫基礎(2)索引複合外來

增、刪、改、查 加“”表示為普通字元 mysql> insert into  t9 values("NULL",21,"game,flim"); +++++++++++++++++++++++++++++++ 新增新欄位 mysql> alter table  t4

資料庫——外來索引

概念: 主鍵(primary key):  能夠唯一標識表中某一行的屬性或屬性組。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常常與外來鍵構成參照完整性約束,防止出現數據不一致。主鍵可以保證記錄的唯一和主鍵域非空,資料庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索

2019-2-25SqlServer 中所有表視圖索引等常用sql

order 表示 npr left exe 指定 條件 臨時對象 user sp_help Accounts_Users 其中Accounts_Users 表示表名 sp_columns Accounts_Users exec sp_helpconst

數據庫——索引理解

就是 技術分享 必須 約束 成績表 組合 學分 dex for 概念: 主鍵(primary key): 能夠唯一標識表中某一行的屬性或屬性組。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常常與外鍵構成參照完整性約束,防止出現數據不一致。主鍵可以保證記錄的唯一和主

Oracle查詢表

efault oracle查詢 sele blog tls const color log 信息 項目中用到的一些Sql(oracle下的)總結:1、查找表的所有索引(包括索引名,類型,構成列) 1 select t.*,i.index_type from user_in

什麽是??

訂單 which test target window 成功 return 方式 times 一、什麽是主鍵、外鍵: 關系型數據庫中的一條記錄中有若幹個屬性,若其中某一個屬性組(註意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵 比如 學生表(學號,姓名,性

【第三章】字段約束:數據完整性非空默認值自增唯一性

索引 記錄 incr efault 主鍵 pri 增長 不可 作用 一、表完整性約束 作用:用於保證數據的完整性和一致性==============================================================約束條件        

(八)MySQL基礎——外來修改表時新增刪除約束標識列

一、主鍵和唯一的區別:   保證唯一性 是否允許為空 一個表可以有多少個 是否允許組合 主鍵 √ × 至多有1個 √,但不推薦

MySql必知必會實戰練習(四)外來sql約束聯結表 MySql資料庫約束

  本博將對主鍵、外來鍵、MySql資料庫約束和聯結表的相關特性進行總結和實戰 1. 主鍵   表中的每一行都應該具有可以唯一標識自己的一列(或一組列),而這個承擔標識作用的列稱為主鍵   如果沒有主鍵,資料的管理會十分混亂。比如會存在多條一模一樣的記錄,刪除和修改特定行十分困難 (1)哪些列可以作為

資料庫——超候選外來

首先看看各種鍵的定義: 超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵 候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵 主鍵(primary key):使用者選作元組標識的一個候選鍵程式主鍵 外來鍵(foreig

候選外來聯合複合

首先看看各種鍵的定義: 超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵(只要有一個鍵唯一,再隨便組其他的鍵,合起來叫主鍵) 候選鍵(candidatekey):不含有多餘屬性的超鍵稱為候選鍵(最小的超鍵,ID,身份證號) 主鍵(primary key):

html遮蔽右禁止複製禁止檢視原始碼

〈HTML〉〈HEAD〉〈TITLE〉網頁加密解密〈/TITLE〉  〈META http-equiv=Content-Type content="text/html; charset=gb2312"〉  〈META content="MSHTML 6.00.2600.0" name=GENERATOR〉〈!

Oracle中給表新增外來

1、建立表的同時建立主鍵約束 (1)無命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create tab

Oracle 中給表新增外來

(1)無命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create table students ( studentid int , stu

資料庫設計(2)外來

轉自:http://blog.csdn.net/championhengyi/article/details/78559789 什麼是主鍵、外來鍵 關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵。

候選區別

超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵 候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵 主鍵(primary key):使用者選作元組標識的一個候選鍵程式主鍵 比如一個小範圍的所有人,沒有重名的,考慮以下屬性 身份證 姓名 性別 年