В статье Александра Кузнецова он приводит следующий фрагмент кода:
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'))
);
Этот фрагмент вызывает у меня несколько вопросов.
Почему необходимо включать в уникальное ограничение и ID
, и Type
? Если только ID
является уникальным, то комбинация этих двух столбцов также всегда будет уникальной.
Кроме того, я знаю, как установить первичный ключ и указать, уникален ли он, в SSMS. Но как я могу задать первичный ключ для одного столбца и сделать уникальное ограничение для комбинации столбцов? Создает ли это два индекса?
Это возникло потому, что я пытаюсь реализовать похожий код, который не создает составной первичный ключ, и получаю следующую ошибку. Поэтому я пытаюсь лучше понять этот код.
Столбцы в таблице 'MyTable' не соответствуют существующему первичному ключу или ограничению UNIQUE.
EDIT
Я смог заставить это работать, просто создав составной первичный ключ в 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