日期:2014-05-17  浏览次数:20487 次

主键、唯一键、聚集的问题
本帖最后由 hgwyl1 于 2013-03-10 10:50:37 编辑
得先声明,刚开始用MSSQL。
所以问题属于很基础
使用表设计器进行操作

1、建立好表
ID       int 标识 自增为1 not null
name     nvarchar(10)

2.1、直接对ID进行右键“设置主键”,然后进入“索引/键”中查看
会得到一个PK开头的玩意~
类型:主键
是唯一的:是
创建为聚集的:是

接着,同样在“索引/键”中添加一个索引,得到一个IX开头的
类型:索引
创建为聚集的:否(灰色不可操作)

是否代表主键即为聚集索引?
如果我想要完成创建name为聚集索引的话,则在PK开头的主键处修改“创建为聚集:否”,才可以创建name为聚集索引?

2.2(2.1步骤不操作)直接右键“索引/键”,此时左边列表中为空
点击“添加”
类型:索引
列:name
是唯一的:否
创建为聚集的:是

接着再添加
类型:唯一键
列:ID
是唯一的:是
创建为聚集的:否

当然,可以不添加“唯一键”,而是返回表设计器对ID“设置主键”
这里,聚集索引建立以后,建立一个“唯一键”和“主键”,有什么具体区别吗?



------解决方案--------------------
这里楼主要搞清几个概念,首先是主键及唯一键的区别,主键并非针对某一个字段,可能是一个字段,也可能存在联合主键,即多个字段联合做主键的情况,和唯一键有较大的出入;其次是聚集索引,一个表只能拥有一个聚集索引,并非一定是主键字段,在创建主键的时候如果没有强制指定是非聚集索引,那么SQL默认会在创建主键的同时在这个字段创建聚集索引,聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续,具体可以参考下聚集索引这些书面资料。
------解决方案--------------------
主键和唯一键更多是设计上的约束逻辑,主键和唯一键的物理实现都是通过唯一索引来实现的。

举个例子,员工号码和身份证号码都可以唯一标识一个员工,随便哪个做主键都可以,不过一般以员工号码作为主键,针对身份证号码创建唯一约束。

PS:主键和唯一键都可以是符合键。