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.


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]

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)

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.