Contrainte unique sur plusieurs colonnes

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

Comment ajouter une contrainte unique pour les colonnes fcode, scode, dcodeavec t-sqlet / ou management studio? fcode, scode, dcodedoivent être uniques ensemble.

loviji
la source
9
Est-ce à dire que vous pouvez avoir plusieurs du même fcode OU scode OU dcode mais jamais deux enregistrements avec le même fcode ET scode ET dcode?
Jimbo

Réponses:

291

En utilisant la définition de contrainte lors de la création d'une table, vous pouvez spécifier une ou plusieurs contraintes qui s'étendent sur plusieurs colonnes. La syntaxe, simplifiée à partir de la documentation de technet , se présente sous la forme de:

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

Par conséquent, la définition de la table de remplacement serait:

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
la source
418

Si la table est déjà créée dans la base de données, vous pouvez ajouter une contrainte unique ultérieurement en utilisant cette requête SQL:

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

Cela peut également être fait dans l'interface graphique. Voici un exemple d'ajout d'une contrainte unique multi-colonnes à une table existante.

  1. Sous le tableau, cliquez avec le bouton droit sur Index -> Cliquez / survolez Nouvel index -> Cliquez sur Index non clusterisé ...

entrez la description de l'image ici

  1. Un nom d'index par défaut sera donné mais vous voudrez peut-être le changer. Vérifiez unique case à cocher et cliquez sur Ajouter ... bouton

entrez la description de l'image ici

  1. Cochez les colonnes que vous souhaitez inclure

entrez la description de l'image ici

Cliquez sur OK dans chaque fenêtre et vous avez terminé.

Tony L.
la source
1
REMARQUE: cette option n'est pas disponible si la table est déjà ouverte en mode Création. Fermez donc l'onglet de conception avant de le faire.
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
la source
13
Bien que ce code puisse répondre à la question, il serait préférable d'inclure un certain contexte, expliquant comment il fonctionne et quand l'utiliser. Les réponses uniquement codées ne sont pas utiles à long terme.
Bono