複数の列に対する一意の制約


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

どのように私は列に一意の制約を追加するfcode, scode, dcodet-sql、および/またはmanagement studiofcode, scode, dcode一緒に一意である必要があります。


9
これは、同じfcode OR scode OR dcodeを多数持つことができるが、同じfcode AND scode AND dcodeを持つ2つのレコードは決して持てないことを意味しますか?
神保

回答:


291

テーブル作成時に制約定義を使用すると、複数の列にまたがる1つまたは複数の制約を指定できます。technetのドキュメントから簡略化された構文は、次の形式です。

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

したがって、結果のテーブル定義は次のようになります。

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

テーブルがすでにデータベースに作成されている場合は、このSQLクエリを使用して、後で一意制約を追加できます。

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

またはADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED
Kiquenet

52

これはGUIでも実行できます。次に、既存のテーブルに複数列の一意制約を追加する例を示します。

  1. テーブルの下で、[ インデックス ]を右クリックし、[ 新しいインデックスのクリック/ホバー] -> [ 非クラスター化インデックスのクリック... ]をクリックします

ここに画像の説明を入力してください

  1. デフォルトのインデックス名が指定されますが、変更することもできます。チェックユニークのチェックボックスをクリックして[追加... ]ボタンを

ここに画像の説明を入力してください

  1. 含める列を確認してください

ここに画像の説明を入力してください

各ウィンドウで[ OK]をクリックすると、完了です。


1
注:テーブルがデザインビューで既に開いている場合、このオプションは使用できません。だから、それを行う前にまずデザインタブを閉じてください。
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
このコードは質問に答える可能性がありますが、それがどのように機能し、いつ使用するかを説明するコンテキストを含めることをお勧めします。コードのみの回答は、長期的には役に立ちません。
Bono、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.