Einzigartige Einschränkung für mehrere Spalten

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

Wie füge ich eine eindeutige Einschränkung für Spalten fcode, scode, dcodemit t-sqlund / oder hinzu management studio? fcode, scode, dcodemuss zusammen einzigartig sein.

loviji
quelle
9
Bedeutet das, dass Sie viele gleiche Fcodes ODER Scodes ODER Dcodes haben können, aber niemals zwei Datensätze mit demselben Fcodes UND Scodes UND Dcodes?
Jimbo

Antworten:

291

Mithilfe der Einschränkungsdefinition bei der Tabellenerstellung können Sie eine oder mehrere Einschränkungen angeben, die sich über mehrere Spalten erstrecken. Die aus der Technet-Dokumentation vereinfachte Syntax lautet:

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

Daher wäre die Definition der resuting-Tabelle:

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
quelle
418

Wenn die Tabelle bereits in der Datenbank erstellt wurde, können Sie später mithilfe dieser SQL-Abfrage eine eindeutige Einschränkung hinzufügen:

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

Dies kann auch in der GUI erfolgen. Hier ist ein Beispiel zum Hinzufügen einer mehrspaltigen eindeutigen Einschränkung zu einer vorhandenen Tabelle.

  1. Klicken Sie in der Tabelle mit der rechten Maustaste auf Indizes -> Klicken Sie auf / Bewegen Sie den Mauszeiger auf Neuen Index -> Klicken Sie auf Nicht gruppierter Index ...

Geben Sie hier die Bildbeschreibung ein

  1. Es wird ein Standardindexname angegeben, den Sie jedoch möglicherweise ändern möchten. Aktivieren Sie das Kontrollkästchen Eindeutig und klicken Sie auf die Schaltfläche Hinzufügen ....

Geben Sie hier die Bildbeschreibung ein

  1. Überprüfen Sie die Spalten, die Sie einschließen möchten

Geben Sie hier die Bildbeschreibung ein

Klicken Sie in jedem Fenster auf OK und Sie sind fertig.

Tony L.
quelle
1
HINWEIS: Diese Option ist nicht verfügbar, wenn Sie die Tabelle bereits in der Entwurfsansicht geöffnet haben. Schließen Sie daher zuerst die Registerkarte "Design", bevor Sie dies tun.
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
quelle
13
Während dieser Code die Frage beantworten kann, ist es besser, einen Kontext einzuschließen, der erklärt, wie er funktioniert und wann er verwendet werden soll. Nur-Code-Antworten sind auf lange Sicht nicht sinnvoll.
Bono