2013-09-08 5 views
30

Ich denke nur, dass die Antwort falsch ist, weil Fremdschlüssel keine uniqueness Eigenschaft hat.kann Fremdschlüssel auf Primärschlüssel in derselben Tabelle verweisen?

Aber einige Leute sagten, dass es sein kann, wenn man sich selbst an den Tisch anschließt. Ich bin neu zu SQL. Wenn es wahr ist, bitte erklären wie und warum?

Employee table 
| e_id | e_name | e_sala | d_id | 
|---- |------- |----- |--------| 
| 1 | Tom | 50K | A | 
| 2 | Billy | 15K | A | 
| 3 | Bucky | 15K | B | 


department table 
| d_id | d_name | 
|---- |------- | 
| A | XXX | 
| B | YYY | 

Jetzt d_id ist Fremdschlüssel so, wie es Primärschlüssel sein kann. Und etwas über join erklären. Was nützt es?

+0

@ sarwar026, diese Frage ist nicht genau das, was das OP hier gefragt hat ... – ryvantage

+0

Vielleicht möchten Sie hinzufügen, welches DBMS Sie verwenden, damit Sie Beispiele bekommen, die für Ihr DBMS funktionieren. –

+0

Ich benutze ORACLE 9.0 – AmanS

Antwort

38

Ich denke, die Frage ist ein bisschen verwirrend.

Wenn Sie meinen "Kann Fremdschlüssel" auf einen Primärschlüssel in der gleichen Tabelle beziehen? ", Ist die Antwort eine feste ja wie einige geantwortet haben. In einer Angestelltentabelle kann beispielsweise eine Zeile für einen Mitarbeiter eine Spalte zum Speichern der Angestelltennummer des Managers enthalten, wobei der Manager auch ein Angestellter ist und daher eine Zeile in der Tabelle wie eine Zeile eines anderen Mitarbeiters hat.

Wenn Sie meinen "kann Spalte (oder Satz von Spalten) ein Primärschlüssel sowie ein Fremdschlüssel in der gleichen Tabelle sein?", Ist die Antwort aus meiner Sicht ein Nein; es scheint bedeutungslos. Die folgende Definition ist jedoch in SQL Server erfolgreich!

Aber ich denke, es ist bedeutungslos, eine solche Einschränkung zu haben, es sei denn jemand kommt mit einem praktischen Beispiel.

AmanS, in Ihrem Beispiel d_id kann in keinem Fall ein Primärschlüssel in Employee-Tabelle sein. Eine Tabelle kann nur einen Primärschlüssel haben. Ich hoffe, das löscht deine Zweifel. d_id ist/kann nur in der Abteiltabelle ein Primärschlüssel sein.

+0

ist mir klar, dass d_id Primärschlüssel der Abteilung Tabelle ist. Auch d_id in der Angestelltentabelle ist ein Fremdschlüssel. und Sie erwähnen auch, dass d_id Primärschlüssel in der gleichen Tabelle (Mitarbeiter) sein kann. mein Lehrer hat mir gesagt, dass im Falle des Selbstverbindens des Angestelltentisches es möglich sein kann. Dieser Punkt ist mir nicht klar, wie? – AmanS

+1

@AmanS, Sie sagten "Sie erwähnen, dass d_id Primärschlüssel in der gleichen Tabelle (Mitarbeiter) sein kann". Aber ich habe es nicht getan; Hier ist meine Aussage "AmanS, in Ihrem Beispiel kann d_id unter keinen Umständen ein Primärschlüssel in der Employee-Tabelle sein". Ich hoffe du bekommst es. Es ist nicht möglich, selbst im Fall von selbst zu verbinden. Eine andere Spalte in einer Tabelle kann sich auf den Primärschlüssel derselben Tabelle beziehen. Z.B. create table employee (e_id int Primärschlüssel, e_name varchar (30), e_mgr int, Fremdschlüssel (e_mgr) verweist auf Mitarbeiter (e_id)). Dies ist ein Self-Join-Fall und e_mgr ist ein Fremdschlüssel, der sich auf den Primärschlüssel e_id bezieht. – mvsagar

+0

Können Sie mir irgendein praktisches Beispiel mit einer Abfrage nennen, in der sich fremder auf den Primärschlüssel beziehen kann? aber hier auch die Person unten (RYVANTAGE) sagte, dass es .... ich bin verwirrt bitte helfen – AmanS

15

Sicher, warum nicht? Nehmen wir an, Sie haben eine Person Tabelle mit id, name, age und parent_id, wobei parent_id ein Fremdschlüssel für die gleiche Tabelle ist. Sie müssten die Person Tabelle zu Parent und Child Tabellen nicht normalisieren, das wäre übertrieben.

Person 
| id | name | age | parent_id | 
|----|-------|-----|-----------| 
| 1 | Tom | 50 |  null | 
| 2 | Billy | 15 |   1 | 

So etwas Ähnliches.

Ich denke, um die Konsistenz zu erhalten, müsste es mindestens 1 Null-Wert für parent_id sein, obwohl. Die eine "Alpha-Männchen" -Reihe.

EDIT: Wie die Kommentare zeigen, fand Sam einen guten Grund, dies nicht zu tun. Es scheint, dass in MySQL, wenn Sie versuchen, Änderungen am Primärschlüssel vorzunehmen, selbst wenn Sie CASCADE ON UPDATE angeben, wird die Bearbeitung nicht ordnungsgemäß weitergegeben. Obwohl Primärschlüssel für die Bearbeitung in der Produktion (normalerweise) tabu sind, ist dies dennoch eine Einschränkung, die nicht ignoriert werden sollte. Daher ändere ich meine Antwort zu: Sie sollten diese Praxis wahrscheinlich vermeiden, es sei denn, Sie haben ziemlich strenge Kontrolle über das Produktionssystem (und kann garantieren, dass niemand ein Steuerelement implementiert, das die PKs bearbeitet). Ich habe es nicht außerhalb von MySQL getestet.

+0

nur meine editierte Frage mit Beispiel sehen. ist deine antwort immer noch ja? – AmanS

+0

Es funktioniert nicht für 'update'. Überprüfen Sie http://sqlfiddle.com/#!9/445052/1/0 und versuchen Sie dann 'Update menu set id = 6 WHERE id = 1 hinzuzufügen;' Sie erhalten '# 1451 - Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden' – Sam

+0

@Sam zwei Dinge: 1) Ich sehe, dass es nicht funktioniert, aber ich stimme nicht überein, dass es scheitern sollte. Bei einem kaskadierenden Update scheint es keinen logischen Grund dafür zu geben, warum das Update fehlschlagen sollte. 2) Wer ändert die PK in der Praxis? Leute, die nach Ärger fragen lol – ryvantage

3

ZB: n Unterkategorie für Kategorien.Die untenstehende Tabelle Primärschlüssel id wird durch Fremdschlüssel bezeichnet sub_category_id

enter image description here

0

Ein gutes Beispiel für ids von anderen Zeilen in derselben Tabelle mit als Fremdschlüssel Listen verschachtelt ist. Das Löschen einer Zeile mit untergeordneten Elementen (d. H. Zeilen, die sich auf die ID des übergeordneten Elements beziehen), die ebenfalls childred sind (d. H. Auf ids von Kindern verweisen) ... löscht eine Kaskade von Zeilen. Eine ganze Menge Schmerzen gelindert (und eine Menge Code, was mit Waisen zu tun ist - d. H. Zeilen, die sich auf nicht existierende IDs beziehen).

Verwandte Themen