Home > Database > Mysql Tutorial > SQLSERVER聚集索引和主键的误区

SQLSERVER聚集索引和主键的误区

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 15:45:16
Original
1034 people have browsed it

SQLSERVER聚集索引和主键的误区 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。 主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。 所以在一个(或一组)字段上

SQLSERVER聚集索引和主键的误区

很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。


 

主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。

所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引。

例如下面:

<span> 1</span> <span>USE</span> <span>[</span><span>pratice</span><span>]</span>
<span> 2</span> <span>GO</span>
<span> 3</span> <span>CREATE</span> <span>TABLE</span><span> #tempPKCL
</span><span> 4</span> <span>( 
</span><span> 5</span>   ID <span>INT</span> <span>PRIMARY</span> <span>KEY</span> <span>CLUSTERED</span>  <span>--</span><span>聚集索引</span>
<span> 6</span> <span>)
</span><span> 7</span> 
<span> 8</span> 
<span> 9</span> <span>--</span><span>-------------------------------</span>
<span>10</span> <span>USE</span> <span>[</span><span>pratice</span><span>]</span>
<span>11</span> <span>GO</span>
<span>12</span> <span>CREATE</span> <span>TABLE</span><span> #tempPKNCL
</span><span>13</span> <span>( 
</span><span>14</span>   ID <span>INT</span> <span>PRIMARY</span> <span>KEY</span> <span>NONCLUSTERED</span>  <span>--</span><span>非聚集索引</span>
<span>15</span> <span>)
</span><span>16</span> 
<span>17</span> 
<span>18</span> <span>DROP</span> <span>TABLE</span> <span>[</span><span>#tempPKCL</span><span>]</span>
<span>19</span> <span>DROP</span> <span>TABLE</span> <span>[</span><span>#tempPKNCL</span><span>]</span>
Copy after login

如果不加NONCLUSTEREDCLUSTERED关键字,默认建的是聚集索引

 

而一个聚集索引里,是可以有重复值的。只要他没有被同时设为主键,但是主键不能有重复值(不管依附在聚集索引上还是非聚集索引上)

强调这一点,是因为有些人觉得自己的表格上设置了主键,就认为表格上有聚集索引,按照B-树的方式管理了。

如果没有指定主键是个聚集索引,可能表格还是会以堆的方式管理,效率低下


 

关于排序和重复值

排序:建立复合索引的时候会指定多个字段,那么这个索引顺序是按哪个字段顺序排序呢?

是按照索引上的第一个字段排序

下面这个索引的排序顺序是以ID这个字段排序的

<span>1</span> <span>CREATE</span> <span>INDEX</span> tempPKNCL_id_ncl <span>ON</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>tempPKNCL</span><span>]</span>(<span>[</span><span>ID</span><span>]</span>,<span>[</span><span>a</span><span>]</span>,<span>[</span><span>c</span><span>]</span>)
Copy after login

 

重复值:如果对多列定义了 PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARY KEY 约束定义中所有列的任何值组合必须唯一。

如下图所示,Purchasing.ProductVendor 表中的 ProductID 和 VendorID 列构成了针对此表的复合 PRIMARY KEY 约束。

这确保了 ProductID 和 VendorID 的组合是唯一的

SQLSERVER聚集索引和主键的误区

 

 

意思是说,如果是复合主键,那么如果ProductID列有重复,但是 ProductID 和 VendorID 的组合是唯一的

言下之意:

(1)主键不是复合主键

(2)主键建立在ProductID字段上

(3)ProductID字段有重复值

那么主键建立肯定会失败

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
Problem with tp6 connecting to sqlserver database
From 1970-01-01 08:00:00
0
0
0
Unable to connect to SQL Server in Laravel
From 1970-01-01 08:00:00
0
0
0
Methods of parsing MYD, MYI, and FRM files
From 1970-01-01 08:00:00
0
0
0
SQLSTATE: User login failed
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template