0

当我创建这样的表时

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 创建与主键相关的一个 insys.key_constraints和一个 in 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_id0。但是为什么不像我们对中的那一行所做的那样删除它呢sys.key_constraint

4

1 回答 1

3

您的主键约束恰好由聚集索引强制执行。当你删除约束时,你也会删除聚集索引,留下一个。堆有自己的条目sys.indexes

索引类型:
0 = 堆
1 = 集群
2 = 非 集群

于 2013-03-07T11:23:20.843 回答