表已在我们的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
所以我的问题如下?
我还是相当新的SQL(~2yrs),所以对大多数SQL大师来说这可能是显而易见的,但我只是不明白。
答案 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 *彼此区分。虽然我确定这是有原因的,但我不知道它是什么,对不起。