mysql中key 、primary key 、unique key 與index區別

來源:互聯網
上載者:User

標籤:壓縮   oracle   scribe   關聯式模式   b樹   避免   dom   實施   alter   

key與PRIMARY KEY區別

KEY通常是INDEX同義字。如果關鍵字屬性PRIMARY KEY在列定義中已給定,則PRIMARY KEY也可以只指定為KEY。這麼做的目的是與其它資料庫系統相容。 PRIMARY KEY是一個唯一KEY,此時,所有的關鍵字列必須定義為NOT NULL。如果這些列沒有被明確地定義為NOT NULL,MySQL應隱含地定義這些列。一個表只有一個PRIMARY KEY。如果您沒有PRIMARY KEY並且一個應用程式要求在表中使用PRIMARY KEY,則MySQL返回第一個UNIQUE索引,此索引沒有作為PRIMARY KEY的NULL列


1. 如果Key是空的, 那麼該列值的可以重複, 表示該列沒有索引, 或者是一個非唯一的複合索引的非前置列
2. 如果Key是PRI, 那麼該列是主鍵的組成部分
3. 如果Key是UNI, 那麼該列是一個唯一值索引的第一列(前置列),並別不能含有空值(NULL)
4. 如果Key是MUL, 那麼該列的值可以重複, 該列是一個非唯一索引的前置列(第一列)或者是一個唯一性索引的組成部分但是可以含有空值NULL

如果對於一個列的定義,同時滿足上述4種情況的多種,比如一個列既是PRI,又是UNI
那麼"desc 表名"的時候,顯示的Key值按照優先順序來顯示 PRI->UNI->MUL
那麼此時,顯示PRI

一個唯一性索引列可以顯示為PRI,並且該列不能含有空值,同時該表沒有主鍵

一個唯一性索引列可以顯示為MUL, 如果多列構成了一個唯一性複合索引
因為雖然索引的多列組合是唯一的,比如ID+NAME是唯一的,但是沒一個單獨的列依然可以有重複的值
只要ID+NAME是唯一的即可

 

 

mysql中key 、primary key 、unique key 與index區別

一、key與primary key區別
CREATE TABLE wh_logrecord (
logrecord_id int(11) NOT NULL auto_increment,
user_name varchar(100) default NULL,
operation_time datetime default NULL,
logrecord_operation varchar(100) default NULL,
PRIMARY KEY (logrecord_id),
KEY wh_logrecord_user_name (user_name)
)
Key是索引約束,對錶中欄位進行約束索引的,都是通過primary foreign unique等建立的。常見有foreign key,外部索引鍵關聯用的。
KEY forum (status,type,displayorder) # 是多列索引(鍵)
KEY tid (tid) # 是單列索引(鍵)。
如建表時: KEY forum (status,type,displayorder)
select * from table group by status,type,displayorder 是否就自動用上了此索引,
而當 select * from table group by status 此索引有用嗎?
key的用途:主要是用來加快查詢速度的。

二、KEY與INDEX區別

MySQL 中Index 與Key 的區別

Key即索引值,是關聯式模式理論中的一部份,比如有主鍵(Primary Key),外鍵(Foreign Key)等,用於資料完整性檢否與唯一性限制式等。
而Index則處於實現層面,比如可以對錶個的任意列建立索引,那麼當建立索引的列處於SQL語句中的Where條件中時,就可以得到快速的資料定位,從而快速檢索。
至於Unique Index,則只是屬於Index中的一種而已,建立了Unique Index表示此列資料不可重複,猜想MySQL對Unique Index類型的索引可以做進一步特殊最佳化吧。

於是乎,在設計表的時候,Key只是要處於模型層面的,而當需要進行查詢最佳化,則對相關列建立索引即可。

另外,在MySQL中,對於一個Primary Key的列,MySQL已經自動對其建立了Unique Index,無需重複再在上面建立索引了。

搜尋到的一段解釋:

Note that “primary” is called PRIMARY KEY not INDEX.
KEY is something on the logical level, describes your table and database design (i.e. enforces referential integrity …)
INDEX is something on the physical level, helps improve access time for table operations.
Behind every PK there is (usually) unique index created (automatically).

三、mysql中UNIQUE KEY和PRIMARY KEY有什麼區別

1,Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。而UNIQUE KEY 對列沒有此要求
2,一個表只能有一個PRIMARY KEY,但可以有多個UNIQUE KEY
3,主鍵和唯一鍵約束是通過參考索引實施的,如果插入的值均為NULL,則根據索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時,可以有重複的,而其他的則不能插入重複值。
alter table t add constraint uk_t_1 unique (a,b);
insert into t (a ,b ) values (null,1); # 不能重複
insert into t (a ,b ) values (null,null);#可以重複

四、使用UNIQUE KEY
CREATE TABLE `secure_vulnerability_warning` (
`id` int(10) NOT NULL auto_increment,
`date` date NOT NULL,
`type` varchar(100) NOT NULL,
`sub_type` varchar(100) NOT NULL,
`domain_name` varchar(128) NOT NULL,
`url` text NOT NULL,
`parameters` text NOT NULL,
`hash` varchar(100) NOT NULL,
`deal` int(1) NOT NULL,
`deal_date` date default NULL,
`remark` text,
`last_push_time` datetime default NULL,
`push_times` int(11) default ‘1‘,
`first_set_ok_time` datetime default NULL,
`last_set_ok_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `date` (`date`,`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UNIQUE KEY的用途:主要是用來防止資料插入的時候重複的。

1,建立表時
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下面的 SQL 文法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)

2,當表已被建立時,如需在 "Id_P" 列建立 UNIQUE 約束,請使用下列 SQL:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 文法:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

3,撤銷 UNIQUE 約束
如需撤銷 UNIQUE 約束,請使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID

 

 

 

 

primary key與unique的區別
定義了 UNIQUE 約束的欄位中不能包含重複值,可以為一個或多個欄位定義 UNIQUE 約束。因此,UNIQUE 即可以在欄位級也可以在表級定義, 在 UNIQUED 約束的欄位上可以包含空值。ORACLE自動會為具有 PRIMARY KEY 約束的欄位(主碼欄位)建立一個唯一索引和一個NOT NULL約束,定義PRIMARY KEY約束時可以為它的索引;
UNIQUED 可空,可以在一個表裡的一個或多個欄位定義;PRIMARY KEY 不可空不可重複,在一個表裡可以定義聯合主鍵;
簡單的說,primary key = unique + not null
Primary Key和Unique Key有很多相似之處。但還是有以下區別:
一、作為Primary Key的域/域組不能為null,而Unique Key可以。
二、在一個表中只能有一個Primary Key,而多個Unique Key可以同時存在。
更大的區別在邏輯設計上。Primary Key一般在邏輯設計中用作記錄標識,這也是設定Primary Key的本來用意,而Unique Key只是為了保證域/域組的唯一性。
oracle的constraint中有兩種約束,都是對列的唯一性限制――unique與primary key,但其中是有區別的:
1、unique key要求列唯一,但不包括null欄位,也就是約束的列可以為空白且僅要求列中的值除null之外不重複即可;
2、primary key也要求列唯一,同時又限制欄位的值不能為null,相當於Primary Key=unique + not null。
建立一個primary key和unique key都會相應的建立一個unique index。
primary key的文法:alter table table name add constraint key name primary key( columns);
unique key的文法:alter table table name add constraint key name unique( columns);
一個表只能有一個主鍵,但是可以有好多個UNIQUE,而且UNIQUE可以為NULL值,如員工的電話號碼一般就用UNIQUE,因為電話號碼肯定是唯一的,但是有的員工可能沒有電話。
主鍵肯定是唯一的,但唯一的不一定是主鍵;
不要總把UNIQUE索引和UNIQUE約束混為一談
1、primary key = unique + not null
2、唯一約束和主鍵一樣都是約束的範疇,而且都可以作為外鍵的參考,不同的是,一張表只能有一個主鍵
3、主鍵和唯一約束的建立需要依靠索引,如果在建立主鍵或唯一約束的時候沒有已經建好的索引可以使用的話,Oracle會自動建立一個唯一的索引。

 

 

mysql中key 、primary key 、unique key 與index區別
索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。
表越大,花費時間越多。如果表對於查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到資料檔案的中間,沒有必要考慮所有資料。
如果一個表有1000行,這比順序讀取至少快100倍。注意你需要存取幾乎所有1000行,它較快的順序讀取,因為此時我們避免磁碟尋道。

所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中儲存。字串是自動地壓縮首碼和結尾空間。

索引用於:

快速找出匹配一個WHERE子句的行;
當執行連接時,從其他表檢索行;
對特定的索引列找出MAX()或MIN()值;
如果排序或分組在一個可用鍵的最左面首碼上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。

如果所有索引值部分跟隨DESC,鍵以倒序被讀取。
在一些情況中,一個查詢能被最佳化來檢索值,不用諮詢資料檔案。

如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面首碼,為了更快,值可以從索引樹被檢索出來。

—————————————————————————————————————————————————————————————————————————————

下面是建表的語句:

[sql] view plain copy

CREATE TABLE `phpcolor_ad` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`type` mediumint(1) NOT NULL,
`code` text,
PRIMARY KEY (`id`),
KEY `type` (`type`)
);


 

一、key與primary key區別
[sql] view plain copy
CREATE TABLE wh_logrecord (
logrecord_id int(11) NOT NULL auto_increment,
user_name varchar(100) default NULL,
operation_time datetime default NULL,
logrecord_operation varchar(100) default NULL,
PRIMARY KEY (logrecord_id),
KEY wh_logrecord_user_name (user_name)
)
解析:
KEY wh_logrecord_user_name (user_name)
本表的user_name欄位與wh_logrecord_user_name表user_name欄位建立外鍵
括弧外是建立外鍵的對應表,括弧內是對應欄位
類似還有 KEY user(userid)
當然,key未必都是外鍵

總結:
Key是索引約束,對錶中欄位進行約束索引的,都是通過primary foreign unique等建立的。常見有foreign key,外部索引鍵關聯用的。
KEY forum (status,type,displayorder) # 是多列索引(鍵)
KEY tid (tid) # 是單列索引(鍵)。

如建表時: KEY forum (status,type,displayorder)
select * from table group by status,type,displayorder 是否就自動用上了此索引,
而當 select * from table group by status 此索引有用嗎?

key的用途:主要是用來加快查詢速度的。
[sql] view plain copy
CREATE TABLE `admin_role` (
`adminSet_id` varchar(32) NOT NULL,
`roleSet_id` varchar(32) NOT NULL,
PRIMARY KEY (`adminSet_id`,`roleSet_id`),
KEY `FK9FC63FA6DAED032` (`adminSet_id`),
KEY `FK9FC63FA6C7B24C48` (`roleSet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

主鍵,兩個列組合在一起,是唯一的,內建唯一性索引,並且不能為NULL
另外,兩個Key定義,相當於分別對這兩列建立索引。

innodb
primary key 主鍵叢集索引
key 普通索引

 


MySQL 中Index 與Key 的區別
Key即索引值,是關聯式模式理論中的一部份,比如有主鍵(Primary Key),外鍵(Foreign Key)等,用於資料完整性檢否與唯一性限制式等。
而Index則處於實現層面,比如可以對錶的任意列建立索引,那麼當建立索引的列處於SQL語句中的Where條件中時,就可以得到快速的資料定位,從而快速檢索。
至於Unique Index,則只是屬於Index中的一種而已,建立了Unique Index表示此列資料不可重複,猜想MySQL對Unique Index類型的索引可以做進一步特殊最佳化吧。
於是乎,在設計表的時候,Key只是要處於模型層面的,而當需要進行查詢最佳化,則對相關列建立索引即可。
另外,在MySQL中,對於一個Primary Key的列,MySQL已經自動對其建立了Unique Index,無需重複再在上面建立索引了。
搜尋到的一段解釋:
Note that “primary” is called PRIMARY KEY not INDEX.
KEY is something on the logical level, describes your table and database design (i.e. enforces referential integrity …)
INDEX is something on the physical level, helps improve access time for table operations.
Behind every PK there is (usually) unique index created (automatically).

三、mysql中UNIQUE KEY和PRIMARY KEY有什麼區別
1,Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。
而UNIQUE KEY 對列沒有此要求
2,一個表只能有一個PRIMARY KEY,但可以有多個UNIQUE KEY
3,主鍵和唯一鍵約束是通過參考索引實施的,如果插入的值均為NULL,
則根據索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時,可以有重複的,而其他的則不能插入重複值。
alter table t add constraint uk_t_1 unique (a,b);
insert into t (a ,b ) values (null,1); # 不能重複
insert into t (a ,b ) values (null,null);#可以重複

四、使用UNIQUE KEY
[sql] view plain copy
CREATE TABLE `secure_vulnerability_warning` (
`id` int(10) NOT NULL auto_increment,
`date` date NOT NULL,
`type` varchar(100) NOT NULL,
`sub_type` varchar(100) NOT NULL,
`domain_name` varchar(128) NOT NULL,
`url` text NOT NULL,
`parameters` text NOT NULL,
`hash` varchar(100) NOT NULL,
`deal` int(1) NOT NULL,
`deal_date` date default NULL,
`remark` text,
`last_push_time` datetime default NULL,
`push_times` int(11) default ‘1‘,
`first_set_ok_time` datetime default NULL,
`last_set_ok_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `date` (`date`,`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

UNIQUE KEY的用途:主要是用來防止資料插入的時候重複的。

1,建立表時
[sql] view plain copy

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下面的 SQL 文法:
[sql] view plain copy
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)

2,當表已被建立時,如需在 "Id_P" 列建立 UNIQUE 約束,請使用下列 SQL:
[sql] view plain copy
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 文法:
[sql] view plain copy
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

3,撤銷 UNIQUE 約束
如需撤銷 UNIQUE 約束,請使用下面的 SQL:
[sql] view plain copy
ALTER TABLE Persons
DROP INDEX uc_PersonID

 

 

 

 

 

 

 

 

 

mysql中key 、primary key 、unique key 與index區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.