Restricción única en múltiples columnas

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

¿Cómo agrego una restricción única para columnas fcode, scode, dcodecon t-sqly / o management studio? fcode, scode, dcodedeben ser únicos juntos.

loviji
fuente
99
¿Eso significa que puede tener muchos de los mismos fcode OR scode OR dcode pero nunca dos registros con el mismo fcode AND scode AND dcode?
Jimbo

Respuestas:

291

Al usar la definición de restricción en la creación de la tabla, puede especificar una o varias restricciones que abarcan varias columnas. La sintaxis, simplificada de la documentación de technet , tiene la forma de:

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

Por lo tanto, la definición de la tabla de descanso sería:

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

Si la tabla ya está creada en la base de datos, puede agregar una restricción única más adelante utilizando esta consulta SQL:

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

Esto también se puede hacer en la GUI. Aquí hay un ejemplo que agrega una restricción única de varias columnas a una tabla existente.

  1. Debajo de la tabla, haga clic con el botón derecho en Índices -> Haga clic / pase el mouse sobre Nuevo índice -> Haga clic en Índice no agrupado ...

ingrese la descripción de la imagen aquí

  1. Se le dará un nombre de índice predeterminado, pero es posible que desee cambiarlo. Compruebe única casilla de verificación y haga clic en Agregar ... botón

ingrese la descripción de la imagen aquí

  1. Marque las columnas que desea incluir

ingrese la descripción de la imagen aquí

Haga clic en Aceptar en cada ventana y ya está.

Tony L.
fuente
1
NOTA: Esta opción no está disponible si ya tiene la tabla abierta en la vista de diseño. Entonces cierre la pestaña de diseño primero antes de hacerlo.
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
fuente
13
Si bien este código puede responder la pregunta, sería mejor incluir algo de contexto, explicando cómo funciona y cuándo usarlo. Las respuestas de solo código no son útiles a largo plazo.
Bono