主键约束,唯一性约束和唯一索引
2015-08-31 15:23
232 查看
1,主键约束创建索引
作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null。
查看Sql Server为主键约束创建的索引
唯一索引和通过主键约束创建的索引是唯一索引的不同之处是不允许索引列为空,因为索引列就是主键列。
2,唯一性约束
作为唯一性约束的列是唯一的,但是可以为Null,在唯一性约束中,null值是相等的。如果唯一性约束的列是单列,那么只有一行数据列能够为null;如果唯一性约束的列是多列,那么列任意一种组合,不能相同。
Sql Server 在创建唯一性约束时,会自动创建一个唯一索引。
查看唯一性约束创建的索引
3,唯一性约束和主键约束的区别
唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。
可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的,但是,唯一性约束所在的列并不是表的主键列。
唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。
一个表上只能有一个主键约束,但是可以有多个唯一性约束。
4,不通过主键约束和唯一约束创建唯一索引
创建唯一非聚集索引
创建唯一聚集索引
查看索引的信息
5,删除主键约束和唯一性约束自动创建的唯一索引
由于唯一索引是由主键约束或唯一性约束自动创建的,必须删除约束,才能删除索引。
作为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]
相关文章推荐
- IOS第15天(1,事件处理View的拖拽)
- 居中展示图片
- mysql数据备分与步聚
- spring mvc Controller间跳转 重定向 传参
- 我与一只流浪猫的相遇
- viewpager的fragment嵌套viewpager的问题
- 网页设计规范
- 为关联容器编写插入迭代器
- hadoop是什么
- 【Matlab学习笔记】(五)变量与常量
- Java程序员应该知道的10个调试技巧
- rabbitmq在高可用HA方面的方案总结
- “#ifdef __cplusplus extern "C" { #endif”的定义
- [读书笔记]代码的坏味道---何时重构
- Knockout应用开发指南 第三章:绑定语法(3)
- Knockout应用开发指南 第四章:模板绑定
- malloc函数详解
- eclipse 版本区别
- singleTask 和singleInstance差异
- Java锁的种类以及辨析——阻塞锁