PRIMARY KEYs vs. UNIQUE Constraints

В статье Александра Кузнецова он приводит следующий фрагмент кода:

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. Почему необходимо включать в уникальное ограничение и ID, и Type? Если только ID является уникальным, то комбинация этих двух столбцов также всегда будет уникальной.

  2. Кроме того, я знаю, как установить первичный ключ и указать, уникален ли он, в 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

5
задан Jonathan Wood 10 February 2012 в 20:56
поделиться