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.