mehrere FK auf dieselbe Spalte?

deadparrot

Grünschnabel
Hallo,

ich bin gerade mit dem Aufbau einer Datenbank (MS SQL Server) beschäftigt, allerdings habe ich gerade ein konzeptionelles Problem:

Ich möchte in einer Tabelle Personen zwei ForeignKeys definieren, die allerdings auf dieselbe Spalte in einer Tabelle Adressen verweisen. (damit soll es möglich sein Privat- und Geschäftsadressen zu einer Person zu speichern). Meine Frage: Ist das überhaupt möglich, bzw. gibt es dafür eine bessere Lösung?
Bei der Modellierung der DB in Visio war es nämlich nicht möglich zwei FK-Spalten in einer Tabelle auf dieselbe Spalte einer anderen zu definieren.
Danke im Vorraus!
 
Hi und willkommen im Forum

Gegenfrage: Hast du es denn schon mal probiert, den 2. ForeignKey anzulegen?
Also mit:
Code:
ALTER TABLE MyTable ADD CONSTRAINT MyConstraint FOREIGN KEY MyColumn REFERENCES MyTable2 (MyColumn2)

Wenn dieser Befehl ausgeführt wird, müsste deine Frage eigentlich beantwortet sein (wenn nicht dann eigentlich auch ;) ).
Beachte dabei, dass die beiden Constraints unterschiedliche Namen haben.
 
Hallo,

ja, also das Anlegen des zweiten FK funktioniert ja nicht. Was mich nur interessiert ist, wie ich das Problem dann löse. Ich habe in einem Forum ein ähnliches Problem gesehen, da wurde vorgeschlagen nur einen FK anzulegen, und auf diese Spalte zwei Indizies anzulegen. Nur frage ich mich was das bringen soll?
 
Das geht einwandfrei, anbei ein Script, das bei mir funktioniert. Generier' doch mal eine Test DB und lass Visio ein reverse engineering machen, um zu sehen, wie diese doppelte referenzierung in Vision aussieht.

CREATE TABLE Adressen (
pk_adresse int IDENTITY (1, 1) NOT NULL CONSTRAINT PK_Adressen PRIMARY KEY (pk_adresse)
, strasse varchar (100) NOT NULL
, ort varchar (50) NOT NULL
)

CREATE TABLE Personen (
pk_person int IDENTITY (1, 1) NOT NULL CONSTRAINT PK_Personen PRIMARY KEY (pk_person)
, adresse1 int NOT NULL CONSTRAINT FK_Personen_Adressen1 FOREIGN KEY REFERENCES Adressen (pk_adresse)
, adresse2 int NOT NULL CONSTRAINT FK_Personen_Adressen2 FOREIGN KEY REFERENCES Adressen (pk_adresse)
)
 
OK, sorry

Das es nicht funktioniert, hattest du nicht geschrieben. Hätte ja sein können, das Visio das nicht unterstützt.
Muss mich jetzt aber bei deinem Problem mit einreihen. Hab grad ne Aufgabe bekommen, bei der genau das selbe Problem auftritt. ^^

Edit:
@ andi

Wenn ich ihn richtig verstanden hab, ist es genau umgekehrt. Also so das eine Baumstruktur entsteht. Und das scheint nicht zu funktionieren.
 
Zuletzt bearbeitet:
Also ich habe mich zunächst gewundert, dass es bei Visio so nicht möglich war diese doppelte Referenz zu definieren.

Man muss dazu halt eine zweite Beziehung einfügen, so sieht das dann auch aus, wenn ich ein reverse engineering aus einer bestehenden DB mache. Also wenn das mit der doppelten Referenzierung so funktioniert wie im Script von Andi dann kann man das doch durchaus so machen, oder wie löst du jetzt dein Problem, niggo?
 
Ich glaub niggo ist von einer anderen Problemstellung ausgegangen als ich. Meine Lösung funktioniert definitiv, ich wende das in der Praxis auch so an.
 
Bei mir ist folgendes Problem:
Code:
CREATE TABLE treeitem (
treeitemid int,
treeitemname varchar )

CREATE TABLE treeitemtotreeitem (
treeitemparentid int,
treeitemchildid int )

ALTER TABLE treeitem ADD CONSTRAINT PK_treeitem PRIMARY KEY (treeitemid)
ALTER TABLE treeitemtotreeitem ADD CONSTRAINT FK_treeitemtotreeitem_treeitem1 FOREIGN KEY (treeitemparentid) REFERENCES treeitem (treeitemid) ON DELETE CASCADE
-- bis hierher alle i.o,
ALTER TABLE treeitemtotreeitem ADD CONSTRAINT FK_treeitemtotreeitem_treeitem2 FOREIGN KEY (treeitemchild) REFERENCES treeitem (treeitemid) ON DELETE CASCADE
-- hier kommt ein Fehlermeldung Zwecks Constraintverletzung

Hier kann ich den 2. FK leider nicht anlegen (oder ich bin zu blöd dafür). Liegt es vielleicht am Kaskadierendem Löschen?
 
Müsste deine zweite Anweisung nicht so lauten?

Code:
ALTER TABLE treeitemtotreeitem ADD CONSTRAINT FK_treeitemtotreeitem_treeitem2 FOREIGN KEY (treeitemchildid) REFERENCES treeitem (treeitemid) ON DELETE CASCADE
 
Zurück