2010-04-20 14 views
0

J'ai un (simplifié) tableau composé de trois colonnes:SQL - Comment appliquer une contrainte "semi-unique"?

id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
foreignID INT NOT NULL, 
name VARCHAR NOT NULL 

Fondamentalement, je voudrais ajouter une contrainte (au niveau de la base de données plutôt qu'au niveau de l'application) où il possible que pour un unique » name 'existe par foreignID. Par exemple, compte tenu des données (id, foreignid, nom):

1,1,Name1 
2,1,Name2 
3,1,Name3 
4,2,Name1 
5,2,Name2 

Je veux la contrainte à l'échec si l'utilisateur tente d'insérer une autre « Nom3 » sous foreignId 1, mais réussir si l'utilisateur tente d'insérer ' Name3 'sous foreignId 2. Pour cette raison, je ne peux pas simplement rendre toute la colonne UNIQUE.

J'ai de la difficulté à trouver une expression SQL pour y parvenir, quelqu'un peut-il m'aider?

Merci

Répondre

3

Ajouter une contrainte unique sur (ForeignID, Name). La syntaxe exacte pour cela dépend de votre SGBD. Pour SQL Server:

CREATE UNIQUE INDEX IndexName ON YourTable (ForeignID, Name) 

(Les termes "contrainte unique", "clé unique" et "index unique" désignent à peu près la même.)

+0

Hé des thats cool, je ne savais pas qu'on pouvait faire ça! Merci! –

2

créer un composite (multiple - colonne) clé ... sur ces deux colonnes

Create Unique Index MyIndexName On TableName(ForeignID, Name) 
Questions connexes