48

我有這樣一個表:如何根據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列的唯一約束?

回答

51

你可以試試這個:

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

26

您可以添加唯一約束土特產品的領域:

ALTER TABLE YourTable 
ADD CONSTRAINT UQ_UserId_ContactID UNIQUE(UserId, ContactID) 
1
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 
) 
) 
3

以下是創建一個語法獨特的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

6

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

希望這有助於 歡呼聲。