为什么SQL Server不删除基本索引而不是更新它们?

时间:2013-03-07 11:16:40

标签: sql sql-server

当我创建这样的表

CREATE TABLE Test
(TestId INT IDENTITY(1,1) NOT NULL,
FName VARCHAR(255) NOT NULL,
LName VARCHAR(255) NOT NULL,
CONSTRAINT PK_TestID PRIMARY KEY(TestId))

SQL Server创建与主键相关,一个在sys.key_constraints中,另一个在sys.indexes中。从运行下面的查询,在创建表之前和之后可以看出。

SELECT Count(*)
FROM
    sys.key_constraints

SELECT Count(*)
FROM
    sys.indexes
WHERE
    object_id IN (SELECT object_id
                  FROM
                      sys.objects
                  WHERE
                      type_desc = 'USER_TABLE')

它也使用它们。

当我跑这个

INSERT INTO test
VALUES
    ('Me', 'You')

执行计划显示Clustered Index Insert

但是当我放弃约束时

ALTER TABLE Test
DROP CONSTRAINT PK_TestID
GO

然后运行查询上面的2个查询,sys.key_constraints的计数少于1,然后它具有的数量,如果它应该是什么。但是sys.indexes仍然具有相同的计数,但是当我运行此

SELECT *
FROM
    sys.indexes
WHERE
    object_id IN (SELECT object_id
                  FROM
                      sys.objects
                  WHERE
                      type_desc = 'USER_TABLE')
    AND
    object_id = object_id(N'Test')
ORDER BY
    [name]

name设置为NULLindex_id设置为0.但为什么不像我们在sys.key_constraint中对该行所做的那样删除它?

1 个答案:

答案 0 :(得分:3)

您的主键约束碰巧由聚集索引强制执行。删除约束时,您也会删除聚集索引,并保留heap。堆在sys.indexes中有自己的条目:

  

指数类型:
   0 =堆
  1 =集群
  2 =非聚集