2009-04-02 8 views
1

Ich habe diese Frage zuvor gestellt, aber die Antworten waren nicht das, wonach ich gesucht habe.Eindeutiger Datensatz in Asp.Net SQL

Ich habe eine Tabelle in Asp.net ohne Code erstellt. Es enthält zwei Spalten.

YourUserID und FriendUserId

Dies ist eine viele zu viele Beziehung.

Heres, was ich will:

Es kann mehr Datensätze mit Ihrem Namen als Benutzer-ID sein, gibt es auch mehrere Datensätze mit FriendUserId ist das gleiche sein kann ... aber es kann nicht mehrere Datensätze sein mit den beide den gleichen . Zum Beispiel:

Dave: Greg

Dave: Chris

Greg: Chris

Chris: Greg

ist gut

Dave: Greg

Dave: Greg

ist nicht gut.

Ich rechts auf den Tisch geklickt und wählte Indizes/Keys. Ich stelle dann beide Spalten in den Spaltenbereich und wähle das Unikat. Ich dachte, das würde sie als Ganzes einzigartig machen, aber individuell nicht einzigartig.

Wenn Sie zum Dataset gehen, werden die Schlüssel neben den beiden Spalten angezeigt, und es wird angezeigt, dass eine Einschränkung für beide Spalten vorhanden ist.

Gibt es eine Möglichkeit, nur sicherzustellen, dass Sie keine doppelte Kopie eines Datensatzes in die Tabelle einfügen, ohne dass einzelne Spalten eindeutig sind?

Ich versuchte es mit meiner SQL-Anweisung zu steuern, aber das hat nicht funktioniert. Das habe ich versucht.

EINFÜGEN IN [FriendRequests] ([UserId], [FriendUserId]) VALUES ('"+ UserId +' ','" + PossibleFriend + "') WOHER NICHT EXISTIEREN (SELECT [UserId], [FriendUserId] FROM [FriendRequests])

Das hat aus irgendeinem Grund nicht funktioniert. Vielen Dank für Ihre Hilfe!

+0

Ich bin nicht klar auf, was das Problem ist. Es klingt, als hätten Sie einen zusammengesetzten Schlüssel erstellt. Erhalten Sie einen Fehler? Können Sie doppelte Zeilen einfügen? –

+0

Wenn Sie diese Frage bereits gestellt haben, versuchen Sie, Ihre ursprüngliche Frage so zu stellen, wie die Leute gefragt haben, anstatt eine neue zu erstellen, um das Board zu überladen. http://stackoverflow.com/questions/707767/sql-unique-record-not-column –

Antwort

3

Sie sollten einen zusammengesetzten Primärschlüssel erstellen, um doppelte Zeilen zu vermeiden.

ALTER TABLE FriendRequests 
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID) 

Oder wählen Sie beide Spalten im Tabellendesigner aus und klicken Sie mit der rechten Maustaste, um sie als Schlüssel festzulegen.

Selbst Freundschaft Um zu verhindern, würden Sie einen CHECK Einschränkung erstellen:

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

Sie können die Check-Einschränkung im Designer mit der rechten hinzufügen überall in der Tabelle Designer klicken, auf "Check Constraints", klicken „hinzufügen“, und Einstellung Ausdruck UserID <> FriendUserID

Sie könnten this question

+0

Wie machst du das ohne Code, weil ich die Tabellen auf diese Weise nicht erstellt habe? Ist es schlechtes Design, die Tabelle ohne Code zu erstellen? – user84786

+0

Sie können die Tabelle immer noch mit Code ändern. Aber wie gesagt, öffne den Tabellendesigner, wähle beide Spalten aus und klicke mit der rechten Maustaste, um den Schlüssel zu setzen. –

+0

Es tut mir leid, ich kommentiert, bevor Sie mit der Eingabe der Antwort fertig ... Danke! – user84786

1

Klingt, als ob Sie einen zusammengesetzten Schlüssel benötigen, um beide Felder zu einem einzigen Schlüssel zu machen.

0

ich eine bessere Idee zu suchen. Erstellen Sie eine neue Tabelle. Genannt FriendRequestRelationships. Sind die folgenden Spalten

FriendRelationshipId (PRIMARY KEY) UserId_1 (Fremdschlüssel) UserId_2 (Fremdschlüssel)

eine eindeutige Einschränkung Setzen Sie nur auf eine Beziehung wit UserId_1 und UserId_2 zu ermöglichen. Diese Tabelle dient jetzt als Ihr Viele-zu-Viele-Beziehungsgeschirr.

Erstellen Sie eine skalare Funktion, die die FriendUserId für eine Benutzer-ID zurückgeben kann, sagen wir es fn_GetFriendUserIdForUserId genannt

Sie jetzt Ihre Beziehungen, indem Sie die folgende Abfrage

SELECT dbo.fn_GetFriendUserIdForUserId (UserId_1) AS 'angezeigt werden können Friend1 ', dbo.fn_GetFriendUserIdForUserId (UserId_2) AS' Friend2 ', VON FriendRelationshipId