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.


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]

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)

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á.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.