Batasan unik pada banyak kolom

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

Bagaimana cara menambahkan batasan unik untuk kolom fcode, scode, dcodedengan t-sqldan / atau management studio? fcode, scode, dcodeharus unik bersama.

loviji
sumber
9
Apakah itu berarti Anda dapat memiliki banyak kode atau skode ATAU kode sandi yang sama tetapi tidak pernah dua rekaman dengan kode kode DAN skode DAN dcode yang sama?
Jimbo

Jawaban:

291

Dengan menggunakan definisi kendala pada pembuatan tabel, Anda bisa menentukan satu atau beberapa kendala yang menjangkau beberapa kolom. Sintaksnya, disederhanakan dari dokumentasi technet , adalah dalam bentuk:

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

Oleh karena itu, definisi tabel resuting adalah:

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

Jika tabel sudah dibuat di database, maka Anda bisa menambahkan batasan unik nanti dengan menggunakan query SQL ini:

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

Ini juga bisa dilakukan di GUI. Berikut ini contoh menambahkan batasan unik multi-kolom ke tabel yang ada.

  1. Di bawah tabel, klik kanan Indeks -> Klik / arahkan Indeks Baru -> Klik Non-Clustered Index ...

masukkan deskripsi gambar di sini

  1. Nama Indeks default akan diberikan tetapi Anda mungkin ingin mengubahnya. Centang kotak centang Unik dan klik tombol Tambah ...

masukkan deskripsi gambar di sini

  1. Periksa kolom yang ingin Anda sertakan

masukkan deskripsi gambar di sini

Klik OK di setiap jendela dan Anda selesai.

Tony L.
sumber
1
CATATAN: Opsi ini tidak tersedia jika Anda sudah memiliki tabel terbuka dalam tampilan desain. Jadi tutup dulu tab desain terlebih dahulu sebelum melakukannya.
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
Kamil Muhanned
sumber
13
Meskipun kode ini dapat menjawab pertanyaan, akan lebih baik untuk memasukkan beberapa konteks, menjelaskan cara kerjanya dan kapan menggunakannya. Jawaban kode saja tidak berguna dalam jangka panjang.
Bono