Унікальне обмеження для кількох стовпців


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повинні бути унікальними разом.


9
Чи означає це, що у вас може бути багато одного і того ж коду fcode АБО scode АБО, але ніколи два записи з одним і тим же fcode І scode AND 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]

420

Якщо таблиця вже створена в базі даних, ви можете потім додати унікальне обмеження за допомогою цього SQL-запиту:

ALTER TABLE dbo.User
  ADD CONSTRAINT ucCodes UNIQUE (fcode, scode, dcode)

Або ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED?
Кікенет

52

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

  1. Під таблицею клацніть правою кнопкою миші Індекси -> Клацніть / наведіть курсор Новий індекс -> Клацніть Індекс без кластера ...

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

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

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

  1. Перевірте стовпці, які ви хочете включити

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

Натисніть ОК у кожному вікні, і ви закінчите.


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
Хоча цей код може відповісти на питання, було б краще включити деякий контекст, пояснивши, як він працює і коли ним користуватися. Відповіді, що стосуються лише коду, не є корисними в перспективі
Боно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.