Ràng buộc duy nhất trên nhiều cột


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

Làm cách nào để thêm một ràng buộc duy nhất cho các cột fcode, scode, dcodet-sqlvà / hoặc management studio? fcode, scode, dcodephải là duy nhất với nhau


9
Điều đó có nghĩa là bạn có thể có nhiều mã giống nhau HOẶC mã hóa HOẶC mã hóa nhưng không bao giờ có hai bản ghi có cùng mã hóa và mã hóa VÀ mã hóa?
Jimbo

Câu trả lời:


291

Bằng cách sử dụng định nghĩa ràng buộc khi tạo bảng, bạn có thể chỉ định một hoặc nhiều ràng buộc trải rộng trên nhiều cột. Cú pháp, được đơn giản hóa từ tài liệu của Technet , ở dạng:

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

Do đó, định nghĩa bảng tính lại sẽ là:

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

Nếu bảng đã được tạo trong cơ sở dữ liệu, thì bạn có thể thêm một ràng buộc duy nhất sau này bằng cách sử dụng truy vấn SQL này:

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

Hay là ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED?
Kiquenet

52

Điều này cũng có thể được thực hiện trong GUI. Đây là một ví dụ thêm một ràng buộc duy nhất nhiều cột vào một bảng hiện có.

  1. Trong bảng, nhấp chuột phải vào Chỉ mục -> Nhấp / di chuyển Chỉ mục mới -> Nhấp vào Chỉ mục không được nhóm ...

nhập mô tả hình ảnh ở đây

  1. Tên Index mặc định sẽ được cung cấp nhưng bạn có thể muốn thay đổi tên. Kiểm tra Unique hộp kiểm và bấm Add ... nút

nhập mô tả hình ảnh ở đây

  1. Kiểm tra các cột bạn muốn bao gồm

nhập mô tả hình ảnh ở đây

Nhấp vào OK trong mỗi cửa sổ và bạn đã hoàn tất.


1
LƯU Ý: Tùy chọn này không khả dụng nếu bạn đã mở bảng trong dạng xem thiết kế. Vì vậy, hãy đóng tab thiết kế trước khi thực hiện.
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
Mặc dù mã này có thể trả lời câu hỏi, nhưng sẽ tốt hơn nếu bao gồm một số bối cảnh, giải thích cách thức hoạt động và khi nào sử dụng nó. Câu trả lời chỉ có mã là không hữu ích trong thời gian dài.
Bono
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.