database:主键,Clustered或NonClustered

Yto*_*heZ 35 database primary-key clustered-index sql-server-2008

我在SQL server 2008中创建一个数据库,

CREATE TABLE Users
(
    U_Id INT NOT NULL
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(200)
    Password VARCHAR(50)
)
Run Code Online (Sandbox Code Playgroud)

我想让U_Id成为主键.我想问一下有什么区别

 CONSTRAINT pk_UserID PRIMARY KEY (U_Id)
Run Code Online (Sandbox Code Playgroud)

这个

 CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id)
Run Code Online (Sandbox Code Playgroud)

还有这个

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id)
Run Code Online (Sandbox Code Playgroud)

什么时候使用?

我读了一些文章,但我还不清楚.有人可以给我一个快速解释吗?

小智 43

以下声明:

CONSTRAINT pk_UserID PRIMARY KEY (U_Id)
Run Code Online (Sandbox Code Playgroud)

和这一个一样:

CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id)
Run Code Online (Sandbox Code Playgroud)

您只能通过其中一个索引排序表数据物理性,默认情况下,索引是用于主键的索引(主键唯一约束始终由索引支持).

如果要根据其他索引保留要存储的表数据的顺序,则应使用以下命令创建主键:

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id)
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令创建聚簇索引:

CREATE CLUSTERED INDEX ix_Email ON Users (Email); 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您创建的任何非聚集索引将始终包含聚簇索引中的数据(因为这是找到表中实际数据行的方式).[Microsoft docs](http://msdn.microsoft.com/en-us/library/ms177484.aspx)所以不要以为通过将大/宽索引作为聚簇索引来节省空间,除非你表上没有任何其他索引. (3认同)
  • 主键是行的标识符.它必须是唯一的而不是null.Clustered Index告诉SQL如何在磁盘上存储数据.实际数据行按此索引指定的顺序存储.由于它还包含有关数据存储在磁盘上的位置的数据,因此聚簇索引键存储在每个索引中.在几乎所有情况下,最好使它们相同.并且最好将主键作为标识符,以便数据按顺序存储在磁盘上. (2认同)