2009-04-02 6 views
1

J'ai déjà posé cette question mais les réponses n'étaient pas ce que je recherchais.Enregistrement unique dans Asp.Net SQL

J'ai créé une table dans Asp.net sans utiliser de code. Il contient deux colonnes.

YourUserID et FriendUserId

C'est une relation plusieurs à plusieurs.

Heres ce que je veux:

Il peut y avoir plusieurs enregistrements avec votre nom comme ID utilisateur, il peut aussi y avoir plusieurs enregistrements avec FriendUserId étant la même ... mais il ne peut y avoir plusieurs enregistrements à la fois être le même . Par exemple:

Dave: Greg

Dave: Chris

Greg: Chris

Chris: Greg

est bon

Dave: Greg

Dave: Greg

n'est pas bon. J'ai fait un clic droit sur la table et j'ai choisi les index/clés.

J'ai ensuite mis les deux colonnes dans la section des colonnes et j'ai choisi de faire l'unique. Je pensais que cela les rendrait uniques dans leur ensemble, mais individuellement non uniques.

Si vous allez à l'ensemble de données, il affiche les clés à côté des deux colonnes et indique qu'il y a une contrainte avec les deux colonnes en cours de vérification.

Est-il possible de s'assurer que vous n'insérez pas une copie dupliquée d'un enregistrement dans la table sans que les colonnes individuelles soient uniques?

J'ai essayé de le contrôler avec mon instruction d'insertion SQL, mais cela n'a pas fonctionné. C'est ce que j'ai essayé. INSEREZ DANS [FriendRequests] ([UserId], [FriendUserId]) VALUES ('"+ UserId +"', '"+ PossibleFriend +"') O WH NON EXIST (SELECT [ID utilisateur], [FriendUserId] FROM [FriendRequests]

Cela n'a pas fonctionné pour une raison quelconque. Nous vous remercions de votre aide!

+0

Je ne sais pas exactement quel est le problème. Il semble que vous ayez créé une clé composite. Avez-vous une erreur? Êtes-vous capable d'insérer des lignes en double? –

+0

Si vous avez déjà posé cette question, essayez de clarifier votre question initiale à mesure que les gens la demandent plutôt que d'en créer une nouvelle pour encombrer le tableau. http://stackoverflow.com/questions/707767/sql-unique-record-not-column –

Répondre

3

Vous devez créer une clé primaire composée pour éviter les doublons. Ou sélectionnez les deux colonnes dans le concepteur de tableau et cliquez avec le bouton droit de la souris pour le définir comme une clé.

Pour éviter l'auto-amitié, vous souhaitez créer une CHECK contrainte:

ALTER TABLE FriendRequests 
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID) 

Vous pouvez ajouter la contrainte de vérification dans le concepteur par un clic droit n'importe où dans le concepteur de table, en cliquant sur « Vérifier les contraintes », en cliquant « ajouter », et la mise à l'expression UserID <> FriendUserID

Vous voudrez peut-être regarder this question

+0

Comment faites-vous cela sans code parce que je n'ai pas créé les tables de cette façon? Est-ce mauvais design de créer la table sans code? – user84786

+0

Vous pouvez toujours modifier la table avec du code. Mais comme je l'ai dit, ouvrez le concepteur de table, sélectionnez les deux colonnes et cliquez avec le bouton droit pour définir comme clé. –

+0

Je suis désolé j'ai commenté avant que vous ayez fini de taper la réponse ... merci! – user84786

1

Il semble que vous ayez besoin d'une clé composite pour que les deux champs aient une seule clé.

0

J'ai une meilleure idée. Créez une nouvelle table. Appelé FriendRequestRelationships. Ont les colonnes suivantes

FriendRelationshipId (clé primaire) UserId_1 (CONTRAINTE de FOREIGN KEY) UserId_2 (CONSTRAINT FOREIGN KEY)

Mettez une contrainte unique pour permettre un seul esprit de relation UserId_1 et UserId_2. Cette table sert maintenant de votre harnais de relation many-to-many.

Créer une fonction scalaire qui peut renvoyer le FriendUserId pour une UserId, disons qu'il appelle fn_GetFriendUserIdForUserId

Vous pouvez maintenant afficher vos relations en exécutant la requête suivante

SELECT dbo.fn_GetFriendUserIdForUserId (UserId_1) AS ' Friend1 ', dbo.fn_GetFriendUserIdForUserId (UserId_2) AS' ami2 ', FROM FriendRelationshipId

Questions connexes