2012-04-13 13 views
0

ich zwei Tabellen erstellt und hat die folgenden:Wie komme ich Werte frei mit Fremdschlüssel eingeben

Tabelle 1: (Studenten)

CREATE TABLE student(s int, n int, d int, PRIMARY KEY(s), FOREIGN KEY(d) REFERENCES dep(d)); 

Tabelle 2: (dep)

CREATE TABLE dep(d int, n int, PRIMARY KEY(d)); 

Also, wenn ich richtig verstehe, ist d ein Fremdschlüssel der Tabelle 1 und es verweist auf den Primärschlüssel der Abteilung. Daher muss der Primärschlüssel von dep mit dem d in Studenten übereinstimmen. Allerdings, wenn ich die folgende

INSERT INTO dep (1,2); 

Die Anweisung ohne Fehler beendet? Die Schüler-Tabelle ist leer. Wie können die Daten eingefügt werden, wenn auf ihren Primärschlüssel verwiesen wird?

Bitte helfen Sie, danke.

Übrigens konnte ich in den Studenten frei einfügen sogar dep hat keinen entsprechenden Wert. Glaubst du, es liegt an Mysql vs. Orakel?

mysql> select * from student; 
+---+------+------+ 
| s | n | d | 
+---+------+------+ 
| 5 | 5 | 5 | 
+---+------+------+ 
1 row in set (0.00 sec) 

mysql> select * from dep; 
+---+------+ 
| d | n | 
+---+------+ 
| 1 | 2 | 
+---+------+ 
1 row in set (0.00 sec) 

Antwort

2

Die Student-Tabelle hat den Fremdschlüssel d, der der Primärschlüssel der Dep-Tabelle ist. Der Schülertisch ist derjenige, der von der Dep-Tabelle abhängig ist. Die dep-Tabelle hat keine solche Abhängigkeit von dem Schülertisch. Die Einschränkung für die Schüler-Tabelle hat den Wert d, der immer in der dep-Tabelle sein sollte.

Das Einfügen eines Datensatzes in die Student-Tabelle mit einem ungültigen Wert für d verursacht den Fehler.

+0

gut ich in der Lage war Zufallszahl an Studenten frei einzufügen, denken Sie, ist es, weil es SQL anders als Orable ist? – eastboundr

+0

Es hat nichts mit SQL oder Oracle zu tun. Wie konnten Sie in den Schülertisch einfügen? War es vor oder nach dem Erstellen der Fremdschlüsseleinschränkung? Sind Sie sicher, dass der Zufallswert für student.d nicht in der Dep-Tabelle ist? – rikitikitik

2

Sie haben Ihr Verständnis in die falsche Richtung. Was Sie in Ihrer SQL getan haben, ist sicher, dass, wenn Sie einen Student eingeben, wird der Wert für d als Wert in dep.d

existieren müssen, wenn Sie

sagte
insert into student values (1, 2, 3) 

dann wäre dies fehlschlagen, wenn es keine Zeile in dep mit d gleich 3

1

Sie in die department Tabelle einfügen können, da es keine Einschränkung für diese Tabelle ist.

Wenn Sie versuchen, eine Zeile in der Student-Tabelle mit der zufälligen Abteilungsnummer hinzuzufügen, die in der Abteiltabelle nicht vorhanden ist, erhalten Sie den Constraint-Fehler.

Beispiel: Wenn Sie

insert into student values (1, 4, 1034); 

versuchen Und wenn es mit dem Wert des Primärschlüssel 1034, dann wird es geben, den Fremdschlüssel keine Zeilen in der Tabelle department ist.

Was Sie tun müssen, ist Ihre Daten beginnend mit dem Elternteil nach unten einfügen.

Wenn Sie Daten löschen müssen, müssen Sie den anderen Weg gehen, löschen Sie die Elemente, bevor Sie den übergeordneten Auftragsdatensatz löschen.

0

Wie üblich, wenn Sie Daten in die Detailtabelle einfügen und Master-Tabelle hat keine entsprechenden Werte, haben Sie einen Fehler - 'Hinzufügen oder Aktualisieren einer untergeordneten Zeile: eine Fremdschlüsseleinschränkung fehlschlägt ...'.

Aber wenn die FOREIGN_KEY_CHECKS Variable auf 0 gesetzt ist, ignoriert MySQL Fremdschlüssel-Constraints -

SET FOREIGN_KEY_CHECKS=0; 
INSERT INTO student VALUES (5,5,5); -- no errors 
SET FOREIGN_KEY_CHECKS=1; 
Verwandte Themen