【发布时间】:2012-02-12 01:23:18
【问题描述】:
在Alexander Kuznetsov article 中,他提供了以下代码 sn-p:
CREATE TABLE dbo.Vehicles(
ID INT NOT NULL,
[Type] VARCHAR(5) NOT NULL,
CONSTRAINT Vehicles_PK PRIMARY KEY(ID),
CONSTRAINT Vehicles_UNQ_ID_Type UNIQUE(ID, [Type]),
CONSTRAINT Vehicles_CHK_ValidTypes CHECK([Type] IN ('Car', 'Truck'))
);
这个 sn-p 向我提出了几个问题。
为什么必须在唯一约束中同时包含
ID和Type?如果只有ID是唯一的,那么这两列的组合也将始终是唯一的。另外,我知道如何设置主键并指定它在 SSMS 中是否唯一。但是我如何在一个列上指定一个主键,并对列的组合进行唯一约束?这会创建两个索引吗?
这是因为我正在尝试实现类似的代码,该代码不会创建复合主键,并且出现以下错误。所以我试图更好地理解这段代码。
“MyTable”表中的列与现有主键或 UNIQUE 约束不匹配。
编辑
我只需在MyTable 中创建一个复合主键就可以完成这项工作。实际的表定义如下所示。同样,这有效。但它与上面引用的代码不同。而且我不确定如果我这样做会不会更好。
CREATE TABLE [dbo].[MessageThread](
[Id] [int] IDENTITY(1,1) NOT NULL,
[MessageThreadType] [int] NOT NULL,
CONSTRAINT [PK_MessageThread_1] PRIMARY KEY CLUSTERED
(
[Id] ASC,
[MessageThreadType] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[MessageThread] WITH CHECK ADD CONSTRAINT [CK_MessageThread_ValidType] CHECK (([MessageThreadType]=(2) OR [MessageThreadType]=(1)))
GO
ALTER TABLE [dbo].[MessageThread] CHECK CONSTRAINT [CK_MessageThread_ValidType]
GO
【问题讨论】:
-
我认为您需要将两列都包含在唯一约束中,因为您希望引用此 2 列组合。 DBMS 需要对此组合使用唯一约束(和索引),以便它们可以强制执行 FK 引用(并快速执行)。
-
@Aaron:当我尝试从我正在创建的表中创建到 MyTable 的 FK 时,我在 SSMS 中遇到了这个错误。
-
@ypercube:我认为这是正确的。虽然,正如我所指出的,它似乎不需要它,因为这种组合总是独一无二的。
-
MyTable 是否有唯一约束或主键?在哪些列上?
-
我分享你的困惑。在这种情况下,使用 UNIQUE 约束 (ID,type) 作为主键似乎是合适的。 ID 列将不需要索引,因为它被 ID,Type 复合索引覆盖。或许展示您的表格描述会让我们更好地了解您的问题。
标签: sql-server sql-server-2008 foreign-keys