主鍵、唯一鍵與唯一索引的區別
一般,我們看到術語“索引”和“鍵”交換使用,但實際上這兩個是不同的。索引是儲存在資料庫中的一個物理結構,鍵純粹是一個邏輯概念。鍵代表建立來實施業務規則的完整性約束。索引和鍵的混淆通常是由於資料庫使用索引來實施完整性約束。
接下來我們看看資料庫中的主鍵約束、唯一鍵約束和唯一索引的區別。
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):使用者選作元組標識的一個候選鍵程式主鍵 比如一個小範圍的所有人,沒有重名的,考慮以下屬性 身份證 姓名 性別 年