如何根据2列创建SQL唯一约束?

问题描述:

我有这样一个表:如何根据2列创建SQL唯一约束?

|UserId | ContactID | ContactName 
--------------------------------------- 
| 12456 | Ax759  | Joe Smith 
| 12456 | Ax760  | Mary Smith 
| 12458 | Ax739  | Carl Lewis 
| 12460 | Ax759  | Chuck Norris 
| 12460 | Bx759  | Bruce Lee 

我需要一个约束添加到此表,以便任何用户都可以有重复的联系人的ID。用户正在从各种外部系统导入数据,因此ContactId在整个电路板上不会是唯一的,但是在每个用户的基础上将是唯一的。

我知道如何创建基于单列的唯一约束和非零约束,但是如何创建跨2列的唯一约束?

你可以试试这个:

CREATE UNIQUE CLUSTERED INDEX index_name ON TABLE (col1,col2) 
or 
CREATE UNIQUE NONCLUSTERED INDEX index_name ON TABLE (col1,col2) 

ALTER TABLE [dbo].[TABLE] ADD CONSTRAINT 
UNIQUE_Table UNIQUE CLUSTERED 
(
col1, 
col2 
) ON [PRIMARY] 
+1

这两种方法有什么区别?在某些情况下,哪一个比另一个更受欢迎?在大型数据集上索引方法会更快吗? – Zapnologica 2015-07-07 06:32:42

+1

@Zapnologica请检查这个关于这个特定主题的其他问题:http://dba.stackexchange.com/questions/144/when-should-i-use-a-unique-constraint-instead-of-a-unique-index – Jonathan 2015-07-08 06:44:57

您可以添加唯一约束土特产品的领域:

ALTER TABLE YourTable 
ADD CONSTRAINT UQ_UserId_ContactID UNIQUE(UserId, ContactID) 

CREATE TABLE [LineItems](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [OrderID] [int] NOT NULL, 
    [LineItemNumber] [int] NOT NULL, 
CONSTRAINT [PK_LineItems] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
), 
CONSTRAINT [UC_LineItems] UNIQUE NONCLUSTERED 
(
    [OrderID] ASC, 
    [LineItemNumber] ASC 
) 
) 

以下是创建一个语法独特的CONSTRAINT而不是唯一的INDEX。

ALTER TABLE publishers 
    ADD CONSTRAINT uqc_pub_name 
    UNIQUE (pub_name) 

重要的是要注意,根据使用哪种方法来排除列的唯一性,存在细微的差异。

见这些有趣的演练下面的MSDN参考:

http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

你可以试试ALTER TABLE [TABLE_NAME] ADD UNIQUE (column1,column2,column3 ...columnN)

希望这有助于 欢呼声。