48

Ich habe eine Tabelle wie diese:Wie kann ich eine eindeutige SQL-Einschränkung basierend auf 2 Spalten erstellen?

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

Ich brauche eine Einschränkung dieser Tabelle hinzugefügt werden, so dass kein Benutzer doppelte Kontakt-IDs haben kann. Die Benutzer importieren Daten von verschiedenen externen Systemen, so dass ContactId nicht eindeutig ist, sondern für jeden Benutzer eindeutig ist.

Ich weiß, wie man Eindeutige und Nicht-Null-Constraints basierend auf einzelnen Spalten erstellt, aber wie kann ich eine eindeutige Einschränkungen über 2 Spalten erstellen?

Antwort

51

Sie können versuchen, diese:

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

oder

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

Was ist der Unterschied zwischen den beiden Methoden? Gibt es bestimmte Fälle, in denen der eine dem anderen vorgezogen wird? Wird der Indexansatz bei einem großen Datensatz schneller sein? – Zapnologica

+1

@Zapnologica Bitte überprüfen Sie diese andere Frage zu diesem speziellen Thema: http://dba.stackexchange.com/questions/144/when-should-i-use-a-unique-constraint-instead-of-a-unique-index – Jonathan

26

Sie können eindeutige Einschränkung hinzufügen tou Ihre Felder:

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

Danke! Funktioniert gut –

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

Hier ist die Syntax für eine Erstellung einzigartiger CONSTRAINT im Gegensatz zu einem einzigartigen INDEX.

ALTER TABLE publishers 
    ADD CONSTRAINT uqc_pub_name 
    UNIQUE (pub_name) 

Es ist wichtig, dass es zu beachten gibt feine Unterschiede in Abhängigkeit davon, welche Methode Sie die Einzigartigkeit einer Spalte enfore verwenden.

Siehe folgende MSDN-Referenz für eine interessante Marsch durch diese:

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

6

Sie ALTER TABLE [TABLE_NAME] ADD UNIQUE (column1,column2,column3 ...columnN) versuchen.

Hoffe, das hilft Prost.