【问题标题】:database: primary key, Clustered or NonClustered数据库:主键、集群或非集群
【发布时间】:2012-05-29 05:41:07
【问题描述】:

我正在 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)
)

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

 CONSTRAINT pk_UserID PRIMARY KEY (U_Id)

这个

 CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id)

还有这个

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id)

什么时候使用?

我读了一些文章,但我仍然不清楚。谁能给我一个快速的解释?

【问题讨论】:

    标签: database sql-server-2008 primary-key clustered-index


    【解决方案1】:

    以下声明:

    CONSTRAINT pk_UserID PRIMARY KEY (U_Id)
    

    和这个一样:

    CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id)
    

    您只能让表数据物理性按一个索引排序,并且默认情况下该索引是用于主键的索引(索引始终支持主键唯一约束)。

    如果您想根据其他索引保留表数据的存储顺序,那么您应该使用以下方法创建主键:

    CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id)
    

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

    CREATE CLUSTERED INDEX ix_Email ON Users (Email); 
    

    【讨论】:

    • 请注意,您创建的任何非聚集索引将始终包含聚集索引中的数据(因为这是在表中找到实际数据行的方式)。 Microsoft docs 因此,除非表上没有任何其他索引,否则不要认为将大/宽索引设为聚集索引会节省空间。
    • 主键是行的标识符。它必须是唯一的且不为空。聚集索引告诉 SQL 如何在磁盘上存储数据。实际数据行按此索引指定的顺序存储。由于它还包含有关数据在磁盘上存储位置的数据,因此聚集索引键存储在每个索引中。在几乎所有情况下,最好使它们相同。而且几乎总是最好将主键作为标识符,以便数据按顺序存储在磁盘上。
    猜你喜欢
    • 2011-01-09
    • 2011-01-18
    • 2011-11-28
    • 2015-11-30
    • 2011-09-12
    • 2011-02-05
    • 1970-01-01
    • 2019-07-11
    • 2015-08-16
    相关资源
    最近更新 更多