gpt4 book ai didi

sql-server - 主键与唯一约束

转载 作者:行者123 更新时间:2023-12-02 21:23:48 25 4
gpt4 key购买 nike

Alexander Kuznetsov article中,他提供了以下代码片段:

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'))
);

这段代码给我提出了一些问题。

  1. 为什么必须在唯一约束中同时包含 IDType?如果只有 ID 是唯一的,那么两列的组合也将始终是唯一的。

  2. 此外,我知道如何设置主键并指定它在 SSMS 中是否唯一。但是我如何在一个列上指定主键,并对列的组合进行唯一约束?这会创建两个索引吗?

出现此问题是因为我正在尝试实现类似的代码,该代码不会创建复合主键,并且出现以下错误。所以我试图更好地理解这段代码。

The columns in table 'MyTable' do not match an existing primary key or UNIQUE constraint.

<小时/>

编辑

我只需在 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

最佳答案

1:我不确定给定模式的具体用途。但请注意,可以出于多种原因应用唯一约束,最常见的是:(a)强制唯一性和(b)为优化器提供更多信息以进行基本决策。

2 :唯一约束不会创建两个索引。它创建一个索引,其中一列作为主键列。它强制两者的唯一性。因此对 a,b 的唯一约束可能是:

a    b    
---- ----
1 1
1 2
2 1
2 2

请注意,两列都不会单独强制执行唯一性。我不太喜欢在 SSMS 中使用表设计器(它有大量错误并且不支持所有功能),但具体操作方法如下:

a) 右键单击​​网格并选择索引/键...

b) 使用网格中的[...]按钮选择多个列

c) 将类型更改为唯一 key

d) 如果需要,更改名称

enter image description here

下面是一个已经有主键的表的示例。如果我愿意,我可以添加一个或多个唯一索引:

enter image description here

关于sql-server - 主键与唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com