5 Stimmen

Kann jemand MySQL-Fremdschlüssel erklären

Ich weiß, was sie sind, aber meine Frage ist, wie man sie verknüpft oder ob sie automatisch verknüpft werden, wenn man identische Namen in verschiedenen Tabellen hat. Hier ist ein Beispiel:

Angenommen, ich habe eine Tabelle [Bestellungen] und eine Tabelle [Kunden]. Jede Zeile in der Tabelle [orders] hat eine customer_id-Nummer, die mit der customer_id in der Tabelle [customer] verknüpft ist. Wie erhalte ich also die Kundeninformationen, indem ich auf die Bestellung verweise? Wie würde die Sql-Abfrage lauten?

7voto

Pascal Thivent Punkte 548176

... wie verknüpfen Sie sie oder werden sie automatisch verknüpft, wenn Sie identische Namen in verschiedenen Tabellen haben.

Dies geschieht nicht automatisch, Sie müssen eine Fremdschlüssel-Beschränkung über die customer_id Spalte der order Tabelle. Dies kann zum Zeitpunkt der Tabellenerstellung oder mit einer ALTER-Anweisung geschehen. Einzelheiten dazu finden Sie in der Dokumentation. Wie bereits erwähnt, beachten Sie, dass beide Tische müssen InnoDB-Tabellen sein (Fremdschlüssel-Beschränkungen werden von der MyISAM-Speicher-Engine nicht unterstützt, die sie ignoriert).

Mit oder ohne FK-Beschränkung würde die Abfrage etwa so lauten:

SELECT * 
FROM CUSTOMER C, ORDER O
WHERE C.ID = O.CUSTOMER_ID
AND O.ID = ...

Eine FK-Beschränkung würde "nur" garantieren, dass die Spalte CUSTOMER_ID der Tabelle ORDER keine Werte enthalten kann, die in der Tabelle CUSTOMER nicht vorhanden sind (außer möglicherweise NULL), und so die referentielle Integrität erzwingen.

4voto

Asaph Punkte 153684

Fremdschlüssel sind pas automatisch durch gemeinsame Namen verknüpft. Eine Sache, die häufig für Verwirrung im Zusammenhang mit MySQL-Fremdschlüsseln sorgt, ist die Tatsache, dass die MyISAM-Tabellen-Engine (die Standardeinstellung) Fremdschlüssel überhaupt nicht unterstützt. Anstatt eine Fehlermeldung auszugeben, wenn ein Fremdschlüssel zu einer MyISAM-Tabelle hinzugefügt wird, ignoriert MySQL die Fremdschlüsseldefinition stillschweigend. Fremdschlüssel werden von der InnoDB-Tabellen-Engine unterstützt, daher sollten Sie sicherstellen, dass alle Tabellen, denen Sie Fremdschlüssel hinzufügen wollen, vom Typ InnoDB-Tabelle sind. Um einen Fremdschlüssel hinzuzufügen, gehen Sie wie folgt vor:

alter table fk_table add foreign key (fk_column) references pk_table (pk_column);

3voto

dnagirl Punkte 19738

Ich gehe davon aus, dass Sie das fragen, weil Sie die Dokumentation gelesen haben und es für Sie keinen Sinn ergibt.

Ein Fremdschlüssel (FK) ist ein Feld in TabelleB, das denselben Wert enthält wie ein Feld, normalerweise der Primärschlüssel (PK), in TabelleA. Also in Pseudocode:

Create TableA:
A_id is PK,
somefield,
anotherfield

Create TableB:
B_id is PK,
A_id is FK to TableA,
farmfield,
outstandingfield

Create constraint on TableB:
In TableB A_id references TableA(A_id),
Don't allow updates to TableA(A_id),
Delete records from TableB that have the same A_id as deleted records in TableA

Wenn Sie dann eine Abfrage durchführen, die beide Tabellen einbezieht, können Sie eine Verknüpfung mit Ihrer FK herstellen:

SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id);

Und wenn Sie aus TabelleA löschen, müssen Sie nicht auch aus TabelleB löschen. Dies geschieht automatisch, da die Einschränkung besagt: "Lösche Datensätze aus TabelleB, die dieselbe A_id haben wie gelöschte Datensätze in TabelleA".

Und wenn Sie in TabelleB einfügen, müssen Sie entweder eine gültige A_id angeben, oder, je nachdem, wie Sie die Spalte definiert haben, die A_id =NULL .

1voto

Bryan McLemore Punkte 6334

Foreign Keys in Mysql sind nur für bestimmte Datenbank-Engines verfügbar. MyISAM gehört nicht dazu.

Ich habe versucht, sie mit InnoDB zu verwenden, und während es die Konsistenz der Daten garantierte, fand ich, dass es eine enorme Leistungseinbußen, die zu vielen gesperrten Tabellen führen, die niemals hätten gesperrt werden dürfen.

Der Hauptvorteil der Verwendung von Fremdschlüsseln besteht darin, sicherzustellen, dass Sie nie einen Auftrag haben, zu dem kein Kunde in der Datenbank vorhanden ist. Aber Sie müssen immer noch per Abfrage auf den Kunden zugreifen.

select * from customer, order where order.customer_id = customer.id and order.id = 5

Die obige Abfrage zeigt Ihnen eine allgemeine Vorstellung davon, wie Sie über einen Lazy Join darauf zugreifen können, auch wenn sie trocken kodiert ist und ich vielleicht den einen oder anderen Tippfehler drin habe.

Meine allgemeine Meinung zu Fremdschlüsseln ist, dass sie großartig sind, aber nicht in MySQL verwendet werden können und dass Postgres sie viel besser handhabt.

-1voto

atk Punkte 9044

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Erstes Ergebnis bei der Suche nach "mysql foreign key" auf Google. Komplett mit Beispielen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X