【问题标题】:SQL SERVER: Unique Constraint ExplanationSQL SERVER:唯一约束说明
【发布时间】:2017-11-02 10:23:28
【问题描述】:

请有人简化将 UNIQUE CONSTRAINT 添加到列的解释。 在创建键索引时,SQL SERVER 是复制行中的所有信息并将其添加到索引中,还是仅将应用了 UNIQUE CONSTRAINT 的列中的数据添加到索引中?

我希望我解释得正确。
任何帮助将不胜感激。
李。

编辑**

好的,我想我明白了吗?

CREATE TABLE dbo.test 
    (
    Id int NOT NULL, 
    Name char(10) NOT NULL UNIQUE
    );

INSERT INTO dbo.test (id, name) VALUES (1, 'Lee')
INSERT INTO dbo.test (id, name) VALUES (2, 'Paul')
INSERT INTO dbo.test (id, name) VALUES (3, 'Adam')
INSERT INTO dbo.test (id, name) VALUES (4, 'Henry')

在聚集索引中,整个表的排序方式如下

3, Adam
4, Henry
1, Lee
2, Paul

那么对于每个额外的 INSERT,服务器都必须根据 name 列重新排序整个表?

在非聚集索引中还有另一个“表”来存储排序?

【问题讨论】:

  • 唯一索引和唯一约束的基本区别是可以禁用索引,唯一约束不能。我不太清楚你想问什么。
  • @prabhat。抱歉,我会尝试解释得更好一些。假设我创建了一个包含 5 列 col1、col2、col3、col4、col5 的表并添加唯一到 col5,SQL Server 是将每列的数据复制到索引中还是仅从 col5 复制?

标签: sql-server unique-constraint


【解决方案1】:

在创建键索引时,SQL SERVER 会复制所有 行中的信息并将其添加到索引或仅添加到 应用了 UNIQUE CONSTRAINT 的列?

没有“关键索引”这样的术语。

索引可以是clusterednon-clustered

当您声明 UNIQUE CONSTRAINT 时,它是逻辑实体,但在物理上由 unique index 创建支持

当您创建 unique constraint 并将其声明为 clustered 时,将创建 clustered index。如果您在约束定义中未提及clustered 或使用显式nonclustered,则会创建非聚集索引。

Non-clustered 索引是一个单独的数据结构,其中每一行都包含关键列。

另一方面,clustered index(或者更好地称之为clustered table)是数据本身+在其上方搜索B树。在这种情况下,不会创建单独的结构,而是表本身现在不是作为堆而是作为有序索引来组织的。

【讨论】:

    【解决方案2】:

    UNIQUE CONSTRAINT 将与UNIQUE INDEX 一样工作。有两种方式:

    • 使用clustered index,行以与索引相同的顺序物理存储在磁盘上。 (因此,只有一个聚集索引是可能的)

    • non clustered index 有第二个列表,其中包含指向物理行的指针。您可以拥有许多非聚集索引,尽管每个新索引都会增加写入新记录所需的时间。

    • 如果您同时拥有聚集索引和非聚集索引,则非聚集索引将指向聚集索引列。

    THIS 'SO'的回答会让你明白一点。

    默认情况下,唯一约束和唯一索引将创建一个非 如果您没有指定任何不同的聚集索引(并且 PK 将由 如果没有冲突的聚集索引,则默认创建为 CLUSTERED 存在),但您可以为任何显式指定 CLUSTERED/NONCLUSTERED 其中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 2013-11-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2010-09-09
      相关资源
      最近更新 更多