为什么系统目录Object_ids根据视图对同一对象有所不同?

时间:2011-05-04 20:14:22

标签: sql-server

表已在我们的SQL Server 2008 R2数据库中在本地服务器上创建,并且还在我们的SQL Server Express 2008中进行设置,该SQL Server Express 2008在开发计算机上与Visual Studio 2010一起安装,使用以下脚本(为了简洁而编辑了一下):

CREATE TABLE dbo.Projects

    (

    Id UNIQUEIDENTIFIER NOT NULL,

    Name NVARCHAR(64) NOT NULL

    ) ON [PRIMARY]

GO

ALTER TABLE dbo.Projects ADD CONSTRAINT

    PK_Projects PRIMARY KEY CLUSTERED 

    (

    Id

    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]



GO

CREATE TABLE [dbo].[ProjectProperties]

    (

    Id UNIQUEIDENTIFIER PRIMARY KEY,

    ProjectPath NVARCHAR(MAX) NOT NULL DEFAULT '.',

    )

GO

ALTER TABLE [dbo].[ProjectProperties] ADD CONSTRAINT

    FK_ProjectProperties_Projects FOREIGN KEY

    (

    Id

    ) REFERENCES dbo.Projects

    (

    Id

    ) ON UPDATE NO ACTION 

     ON DELETE CASCADE 

GO



我使用以下脚本通过其视图查询系统目录以及相关结果(object_ids对于数据库的每个副本都不同,但问题是相同的):

SELECT object_id, name

FROM sys.indexes AS si

GO

object_id  name
354100302  PK__ProjectP__3214EC0717036CC0
SELECT object_id, name

FROM sys.key_constraints AS kc

GO

object_id  name
402100473  PK__ProjectP__3214EC0717036CC0
SELECT object_id, name

FROM sys.tables AS st

GO

object_id  name
354100302  ProjectProperties

所以我的问题如下?

  1. 为什么主键约束的object_ids在sys.indexes和sys.key_constraints视图之间有所不同?
  2. 如果假设sys.tables报告的object_id是正确的,为什么sys.indexes的object_id报告表的object_id?
  3. 我还是相当新的SQL(~2yrs),所以对大多数SQL大师来说这可能是显而易见的,但我只是不明白。


3 个答案:

答案 0 :(得分:0)

约束和索引不是一回事,因此它们具有不同的object_id值。只需自动创建索引即可实现约束。 (作为旁注,我明确命名约束)。

索引与表关联,这就是object_id相同的原因。如果您向同一个表添加了其他索引,那么您会看到它们也具有相同的值,但index_id列会递增。

parent_object_id中的sys.key_constraints也会与您的表格object_id相匹配。我不确定为什么Microsoft的人决定在sys.indexes中使用object_id作为表,但在sys.key_constraints中使用parent_object_id,除非约束被认为是一个对象本身,索引不是。

答案 1 :(得分:0)

354100302是表格的对象ID, 402100473是约束的对象id

(索引是从id,indid键入的)

答案 2 :(得分:0)

我对此并不是100%肯定,但由于可以创建一个非唯一索引,我认为约束(唯一性)和索引(索引)是不同的东西。另外,正如您在下面指出的那样,sys.indexes中出现的* object_id *值是表的值,而不是约束。

正如您所观察到的,sys.indexes表使用table的* object_id *值作为object_id。各个索引通过字段* index_id *彼此区分。虽然我确定这是有原因的,但我不知道它是什么,对不起。