SQL Server主键/索引/唯一约束各名词联系与区别

首先说下主键:PRIMARY KEY 约束唯一标识数据库表中的每条记录。唯一性是主键最主要的特性,主键不能有重复值。主键列不能包含 NULL 值。每个表都应该有一个主键,并且每个表只能有一个主键(可以是多个列为一个主键)。

唯一约束(Unique Constraint):约束唯一标识数据库表中的每条记录,确保表中的某一列或者复合列数据没有相同的值。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的 UNIQUE 约束。请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

下面是创建约束的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)
);

--表已被创建,可以通过修改表增加约束
ALTER TABLE Persons ADD UNIQUE (Id_P);

--可以定义多个列的UNIQUE约束并命名
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName);

索引:SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者字画查找)。主要有如下类型:

1:唯一索引:唯一索引不允许两行有相同的索引值(其实也就是说唯一索引的这一列,每个值都是唯一的); 当创建了唯一约束后,会自动创建唯一索引。

2:主键索引:定义表主键的时候,会自动创建主键索引(其实主键索引就是唯一索引的特例),主键索引要求每一个值都是唯一的且非空。 主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

3:聚集索引:表中各行的物理顺序与键值的逻辑顺序相同,每个表只能有一个。 在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。

4:非聚集索引:非聚集索引指定表的逻辑顺序,数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。 如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。  

注意:SQL Server中,一个表只能创建1个聚集索引,可以有多个非聚集索引。设置某列为主键,如果不加NONCLUSTERED和CLUSTERED关键字,默认建的是聚集索引。所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引。而一个聚集索引里,是可以有重复值的。

以下是创建索引的SQL:

--一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name);

--唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name);

--联合索引
CREATE INDEX index_name ON table_name (column_name1, column_name2);

--创建聚集索引
CREATE CLUSTERED INDEX index_name ON table_name (column_name) WITH(drop_existing=on)    

--创建非聚集索引
CREATE NONCLUSTERED INDEX index_name ON table_name (column_name) WITH(drop_existing=on); 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页