# Wie referenziere ich ein FOREIGN KEY zur gleichen Tabelle



## DerAskTyp (25. April 2017)

Ih habe hier 2 Tabellen: 

CREATE TABLE Adresse( 
    plz INTEGER, 
    ort VARCHAR2(50), 
    CONSTRAINT pk_Adresse1 PRIMARY KEY(plz)  
);  
CREATE TABLE Person( 
    id INTEGER, 
    name VARCHAR2(50), 
    idAdresse INTEGER, 
    art VARCHAR2(50), 
    idParent INTEGER, 
    CONSTRAINT pk_buergerV3 PRIMARY KEY(id,idParent), 
    CONSTRAINT pkey_buergerV3 FOREIGN KEY (idAdresse) REFERENCES Adresse(plz), 
    CONSTRAINT pkey_personParent FOREIGN KEY(idParent) REFERENCES Person(id),
    CONSTRAINT ck_PersonArtV3 CHECK (art = 'Buerger' OR art = 'Beamte' OR art = 'beides') 
); 

Ich will in der Tabelle Person einen idParent haben der (falls es Kinder gibt) auf den parent id referenziert. Ich bekomme hier den Fehler: "kein entsprechender Primär- o. eindeutiger Schlüssel für diese Spaltenliste"  

Ist es möglich auf die gleiche Tabelle zu referenzieren?


----------



## HonniCilest (26. April 2017)

Ich denke, dass es grundsätzlich möglich ist auf die Gleiche Tabelle zu referenzieren.

Aber...

Du referenzierst hier auf den PrimaryKey, welcher UNIQUE und NOTNULL sein sollte. Ich nehme aber an, dass du irgendwo eine Person hast, die keinen Parent hat, also den Wert <null> besitzt und da sitzt aus meiner Sicht das Problem - an irgendeiner Stelle referenzierst du auf <null> und <null> kann Parent(id) nicht sein.

Die richtige Lösung an der Stelle wäre vermutlich eine Parent-Child Beziehungstabelle.


----------



## Yaslaw (26. April 2017)

Erstens: Was für eine DB? MySQL?

Zweitens
CONSTRAINT pk_buergerV3 PRIMARY KEY(id,idParent),
Das gibt dir einen Zirkelbezug, wenn du einen FK von Parent auf die id setzen willst.
Der PK sollte nur die ID enthalten. Die muss eindeutig sein.


----------



## Fragenfrager (28. April 2017)

Was Yaslaw sagt.
Und zusätzlich eine Designanmerkung: "integer" für eine plz ist Verschwendung. Bei MySQL würde SmallInt reichen, zudem bitte "unsigned", denn negative Postleitzahlen gibt es nicht. 
Was ist mit Postcodes, zB aus Großbritannien? Diese sind alphanumerisch...


----------

