当我创建这样的表
时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
设置为NULL
,index_id
设置为0.但为什么不像我们在sys.key_constraint
中对该行所做的那样删除它?
答案 0 :(得分:3)
您的主键约束碰巧由聚集索引强制执行。删除约束时,您也会删除聚集索引,并保留heap。堆在sys.indexes
中有自己的条目:
指数类型:
0 =堆
1 =集群
2 =非聚集