多列唯一约束

292
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

我该如何使用 t-sql 和/或 management studio 为列 fcode,scode,dcode 添加唯一约束?fcode,scode,dcode 必须共同具有唯一性。


13
这是否意味着您可以拥有许多相同的fcode、scode或dcode,但永远不会有两个记录具有相同的fcode和scode和dcode? - Jimbo
4个回答

481
如果数据库中已经创建了表,那么您可以使用以下SQL查询语句后来添加唯一约束:

答案: 如果表已在数据库中创建,则可以使用此SQL查询稍后添加唯一约束:

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

1
还是 ADD CONSTRAINT ucCodes UNIQUE NONCLUSTERED - Kiquenet
如果所有列fcode、scode、dcode都为NULL,则不适用约束条件吗? 如果任何一列fcode、scode、dcode为NULL,则不适用约束条件吗? - Kiquenet
1
@Kiquenet:我不是完全确定你在问什么——NULL的处理方式与其他值相同,这意味着:如果你在这三列上有一个唯一约束条件,那么每个列只能有一个行是NULL - marc_s
https://dev59.com/-Ivda4cB1Zd3GeqPWz0e - Kiquenet

322

通过在创建表的时候使用约束定义,您可以指定跨多列的一个或多个约束。 该语法是从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]

69
这个也可以在GUI中完成。以下是一个将多列唯一约束添加到现有表格的示例。
  1. 在表格下方,右键点击索引 -> 点击/悬停新建索引 -> 点击非聚集索引...

enter image description here

2. 会给出默认的索引名称,但您可能需要更改它。选中“唯一(Unique)”复选框并单击“添加...”按钮。

enter image description here

  1. 检查你想要包含的列

enter image description here

点击每个窗口中的 确定,完成操作。

11
如果您已经在设计视图中打开了表格,则此选项不可用。因此,请先关闭设计选项卡,然后再执行此操作。 - 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

17
虽然这段代码可以回答问题,但最好加入一些上下文来解释它的工作原理和使用时机。仅有代码的答案从长远来看并不实用。 - Bono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接