您的位置:首页 > 其它

主键约束,唯一性约束和唯一索引

2015-08-31 15:23 232 查看
1,主键约束创建索引

作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null。

create table dbo.test
(
id int primary key nonclustered ,
code int
)

create table dbo.test2
(
id int primary key clustered ,
code int
)


查看Sql Server为主键约束创建的索引

select o.name as TableName,
i.name as indexname,i.index_id,i.type_desc,i.is_unique,i.is_primary_key,i.is_unique_constraint,
ic.column_id,
c.name as columnname,c.is_nullable
from sys.objects o
inner join sys.indexes i on o.object_id=i.object_id
inner join sys.index_columns ic on i.object_id=ic.object_id and i.index_id=ic.index_id
inner join sys.columns c on o.object_id=c.object_id  and ic.column_id=c.column_id
where o.name in('test','test2')
order by i.index_id




唯一索引和通过主键约束创建的索引是唯一索引的不同之处是不允许索引列为空,因为索引列就是主键列。

2,唯一性约束

作为唯一性约束的列是唯一的,但是可以为Null,在唯一性约束中,null值是相等的。如果唯一性约束的列是单列,那么只有一行数据列能够为null;如果唯一性约束的列是多列,那么列任意一种组合,不能相同。

Sql Server 在创建唯一性约束时,会自动创建一个唯一索引。

create table dbo.test3
(
id int unique nonclustered,
code int
)

create table dbo.test4
(
id int unique clustered,
code int
)


查看唯一性约束创建的索引

select o.name as TableName,
i.name as indexname,i.index_id,i.type_desc,i.is_unique,i.is_primary_key,i.is_unique_constraint,
ic.column_id,
c.name as columnname,c.is_nullable
from sys.objects o
inner join sys.indexes i on o.object_id=i.object_id
inner join sys.index_columns ic on i.object_id=ic.object_id and i.index_id=ic.index_id
inner join sys.columns c on o.object_id=c.object_id  and ic.column_id=c.column_id
where o.name in('test3','test4')
order by i.index_id




3,唯一性约束和主键约束的区别

唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。

可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的,但是,唯一性约束所在的列并不是表的主键列。

唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。

一个表上只能有一个主键约束,但是可以有多个唯一性约束。

4,不通过主键约束和唯一约束创建唯一索引

创建唯一非聚集索引

create unique nonclustered index idx_unique_id
on dbo.test(id)


创建唯一聚集索引

create unique clustered index cidx_unique_id
on dbo.test(id)


查看索引的信息

select o.name as TableName,
i.name as indexname,i.index_id,i.type_desc,i.is_unique,i.is_primary_key,i.is_unique_constraint,
ic.column_id,
c.name as columnname,c.is_nullable
from sys.objects o
inner join sys.indexes i on o.object_id=i.object_id
inner join sys.index_columns ic on i.object_id=ic.object_id and i.index_id=ic.index_id
inner join sys.columns c on o.object_id=c.object_id  and ic.column_id=c.column_id
where o.name in('test','test2')
order by i.index_id




5,删除主键约束和唯一性约束自动创建的唯一索引

由于唯一索引是由主键约束或唯一性约束自动创建的,必须删除约束,才能删除索引。

alter table dbo.test2
drop constraint [PK__test2__3213E83F3CEDB79B]

alter table dbo.test3
drop constraint [UQ__test3__3213E83EC2DE7C68]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: