Vincolo unico su più colonne


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

Come faccio ad aggiungere un vincolo univoco per le colonne fcode, scode, dcodecon t-sqle / o management studio? fcode, scode, dcodedeve essere unico insieme.


9
Ciò significa che puoi avere molti degli stessi fcode o scode O dcode ma mai due record con lo stesso fcode E scode E dcode?
Jimbo

Risposte:


291

Utilizzando la definizione del vincolo durante la creazione della tabella, è possibile specificare uno o più vincoli che si estendono su più colonne. La sintassi, semplificata dalla documentazione di technet , si presenta sotto forma di:

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

Pertanto, la definizione della tabella di ripristino sarebbe:

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 la tabella è già stata creata nel database, è possibile aggiungere in seguito un vincolo univoco utilizzando questa query SQL:

ALTER TABLE dbo.User
  ADD CONSTRAINT ucCodes UNIQUE (fcode, scode, dcode)

Oppure ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED?
Kiquenet,

52

Questo può essere fatto anche nella GUI. Ecco un esempio che aggiunge un vincolo univoco a più colonne a una tabella esistente.

  1. Sotto la tabella, fai clic con il pulsante destro del mouse su Indici -> Fai clic / passa il mouse su Nuovo indice -> Fai clic su Indice non cluster ...

inserisci qui la descrizione dell'immagine

  1. Verrà assegnato un nome indice predefinito, ma potresti volerlo cambiare. Controllare unica casella di controllo e cliccare su Add ... pulsante

inserisci qui la descrizione dell'immagine

  1. Controlla le colonne che desideri includere

inserisci qui la descrizione dell'immagine

Fai clic su OK in ciascuna finestra e il gioco è fatto.


1
NOTA: questa opzione non è disponibile se la tabella è già aperta nella vista di progettazione. Quindi chiudi la scheda di progettazione prima di farlo.
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
Sebbene questo codice possa rispondere alla domanda, sarebbe meglio includere un certo contesto, spiegando come funziona e quando usarlo. Le risposte di solo codice non sono utili a lungo termine.
Bono,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.