Уникальное ограничение на несколько столбцов

249
CREATE TABLE [dbo].[user](
        [userID] [int] IDENTITY(1,1) NOT NULL,
        [fcode] [int] NULL,
        [scode] [int] NULL,
        [dcode] [int] NULL,
        [name] [nvarchar](50) NULL,
        [address] [nvarchar](50) NULL,
     CONSTRAINT [PK_user_1] PRIMARY KEY CLUSTERED 
    (
        [userID] ASC
    )
    ) ON [PRIMARY]

    GO

Как добавить уникальное ограничение для столбцов fcode, scode, dcodeс t-sqlи / или management studio? fcode, scode, dcodeдолжны быть уникальными вместе.

loviji
источник
9
Означает ли это, что у вас может быть много одинаковых fcode, или scode, или dcode, но никогда не может быть двух записей с одним и тем же fcode, scode и dcode?
Джимбо

Ответы:

291

Используя определение ограничения при создании таблицы, вы можете указать одно или несколько ограничений, охватывающих несколько столбцов. Синтаксис, упрощенный по сравнению с документацией Technet , имеет вид:

CONSTRAINT constraint_name UNIQUE [ CLUSTERED | NONCLUSTERED ] 
(
    column [ ASC | DESC ] [ ,...n ]
)

Поэтому определение следующей таблицы будет:

CREATE TABLE [dbo].[user](
    [userID] [int] IDENTITY(1,1) NOT NULL,
    [fcode] [int] NULL,
    [scode] [int] NULL,
    [dcode] [int] NULL,
    [name] [nvarchar](50) NULL,
    [address] [nvarchar](50) NULL,
    CONSTRAINT [PK_user_1] PRIMARY KEY CLUSTERED 
    (
        [userID] ASC
    ),
    CONSTRAINT [UQ_codes] UNIQUE NONCLUSTERED
    (
        [fcode], [scode], [dcode]
    )
) ON [PRIMARY]
devmake
источник
420

Если таблица уже создана в базе данных, вы можете добавить уникальное ограничение позже, используя этот SQL-запрос:

ALTER TABLE dbo.User
  ADD CONSTRAINT ucCodes UNIQUE (fcode, scode, dcode)
marc_s
источник
Или ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED?
Kiquenet
52

Это также можно сделать в графическом интерфейсе. Вот пример добавления уникального ограничения из нескольких столбцов к существующей таблице.

  1. Под таблицей щелкните правой кнопкой мыши Индексы -> Щелкните / наведите курсор мыши на Новый индекс -> Нажмите Некластерный индекс ...

введите описание изображения здесь

  1. Будет дано имя индекса по умолчанию, но вы можете изменить его. Проверьте уникальный флажок и нажмите кнопку Добавить ... кнопку

введите описание изображения здесь

  1. Проверьте столбцы, которые вы хотите включить

введите описание изображения здесь

Нажмите OK в каждом окне, и все готово.

Тони Л.
источник
1
ПРИМЕЧАНИЕ. Этот параметр недоступен, если таблица уже открыта в режиме конструктора. Поэтому сначала закройте вкладку «Дизайн».
Musefan
0
USE [TSQL2012]
GO

/****** Object:  Table [dbo].[Table_1]    Script Date: 11/22/2015 12:45:47 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_1](
    [seq] [bigint] IDENTITY(1,1) NOT NULL,
    [ID] [int] NOT NULL,
    [name] [nvarchar](50) NULL,
    [cat] [nvarchar](50) NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_Table_1] UNIQUE NONCLUSTERED 
(
    [name] ASC,
    [cat] 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
Муханнед Камил
источник
13
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объясняющий, как он работает и когда его использовать. Ответы только для кода бесполезны в долгосрочной перспективе.
Боно