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.


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]

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)

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.