Restrição exclusiva em várias colunas

248
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

Como adiciono uma restrição exclusiva para colunas fcode, scode, dcodecom t-sqle / ou management studio? fcode, scode, dcodedevem ser únicos juntos.

loviji
fonte
9
Isso significa que você pode ter muitos do mesmo fcode OR scode OR dcode, mas nunca dois registros com o mesmo fcode AND scode AND dcode?
Jimbo

Respostas:

291

Usando a definição de restrição na criação da tabela, você pode especificar uma ou várias restrições que abrangem várias colunas. A sintaxe, simplificada da documentação do technet , está na forma de:

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

Portanto, a definição da tabela de resolução seria:

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
fonte
418

Se a tabela já estiver criada no banco de dados, você poderá adicionar uma restrição exclusiva posteriormente, usando esta consulta SQL:

ALTER TABLE dbo.User
  ADD CONSTRAINT ucCodes UNIQUE (fcode, scode, dcode)
marc_s
fonte
Ou ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED?
Kiquenet
52

Isso também pode ser feito na GUI. Aqui está um exemplo de adição de uma restrição exclusiva de várias colunas a uma tabela existente.

  1. Sob a tabela, clique com o botão direito do mouse em Índices -> Clique / passe o mouse em Novo Índice -> Clique em Índice Não Clusterizado ...

insira a descrição da imagem aqui

  1. Um nome de índice padrão será fornecido, mas você poderá alterá-lo. Verifique única caixa de seleção e clique Add ... botão

insira a descrição da imagem aqui

  1. Marque as colunas que você deseja incluir

insira a descrição da imagem aqui

Clique em OK em cada janela e pronto.

Tony L.
fonte
1
NOTA: Esta opção não estará disponível se você já tiver a tabela aberta no modo de design. Portanto, feche a guia de design antes de fazê-lo.
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
Muhanned Kamil
fonte
13
Embora esse código possa responder à pergunta, seria melhor incluir algum contexto, explicando como ele funciona e quando usá-lo. Respostas somente de código não são úteis a longo prazo.
Bono