Frage

Ich habe langsam das Lernen in den letzten Wochen SQL. Ich habe alle die relationalen Algebra aufgenommen und die Grundlagen, wie relationale Datenbanken arbeiten. Was ich versuche jetzt zu tun ist, lernen, wie es umgesetzt wird.

Ein Stein des Anstoßes ich auf in dieser gekommen sind, ist Fremdschlüssel in MySQL. Ich kann nicht viel über die anderen scheinen zu finden, als dass sie existieren in der InnoDB Speicherschema, das MySQL hat.

Was ist ein einfaches Beispiel für Fremdschlüssel implementiert in MySQL?

Hier ist Teil eines Schemas schrieb ich, dass nicht zu funktionieren scheint, wenn Sie eher meinen Fehler hinweisen würden, als mir ein Arbeitsbeispiel zeigen.

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment,
`content` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`uID` bigint(20) NOT NULL,
`wikiptr` bigint(20) default NULL,
`cID` bigint(20) NOT NULL,
PRIMARY KEY  (`pID`),
Foreign Key(`cID`) references categories,
Foreign Key(`uID`) references users
) ENGINE=InnoDB;
War es hilfreich?

Lösung

Angenommen, Ihre Kategorien und Benutzer bereits Tabelle vorhanden und enthält cid und uID jeweils als Primärschlüssel, sollte diese Arbeit:

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment,
`content` text NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`uID` bigint(20) NOT NULL,
`wikiptr` bigint(20) default NULL,
`cID` bigint(20) NOT NULL,
PRIMARY KEY  (`pID`),
Foreign Key(`cID`) references categories(`cID`),
Foreign Key(`uID`) references users(`uID`)
) ENGINE=InnoDB;

Der Spaltenname wird in der references Klausel erforderlich.

Andere Tipps

Editiert: Robert und Vinko Zustand, dass Sie den Namen des referenzierten Spalts in dem Fremdschlüssel deklarieren müssen. Dies ist notwendig, in InnoDB, obwohl in Standard-SQL sind Sie erlaubt die referenzierte Spaltennamen weglassen, wenn sie den gleichen Namen in der übergeordneten Tabelle ist.

Eine Eigentümlichkeit ich in MySQL erlebt habe, ist, dass Fremdschlüssel Erklärung geräuschlos in mehreren Umständen fehlschlagen:

  • Ihre MySQL-Installation nicht die InnoDB-Engine enthalten
  • Ihre MySQL-Konfigurationsdatei die InnoDB-Engine nicht aktiviert
  • Sie erklären nicht Ihre Tabelle mit der ENGINE = InnoDB Tabelle Modifikator
  • Die Fremdschlüsselspalte ist nicht genau das gleiche Datentyp wie die Primärschlüsselspalte in der referenzierten Tabelle

Leider gibt MySQL keine Nachricht, die es versäumt hat, die Fremdschlüssel zu erstellen. Er ignoriert einfach die Anforderung und erstellt die Tabelle ohne den Fremdschlüssel (wenn Sie TABLE Beiträge SHOW CREATE, können Sie keine Fremdschlüssel Erklärung sehen). Ich habe immer gedacht, das ist eine schlechte Eigenschaft von MySQL ist!

Tipp: das ganzzahlige Argument für Integer-Datentypen (z.B. BIGINT (20)) ist nicht notwendig. Es hat nichts mit der Speichergröße oder dem Bereich der Säule zu tun. BIGINT ist immer die gleiche Größe, unabhängig von dem Argument, geben Sie es. Die Zahl gibt an, wie viele Stellen MySQL-Pad die Spalte, wenn Sie die ZEROFILL Spalte Modifikator.

Diese hat einige Code zeigt, wie Fremdschlüssel selbst erstellen und in CREATE TABLE.

Hier ist eine der einfacheren Beispiele davon:

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT, 
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) REFERENCES parent(id)
    ON DELETE CASCADE
) ENGINE=INNODB;

Ich stimme mit Robert. Sie vermissen den Namen der Spalte in der references-Klausel (und Sie sollten den Fehler 150 bekommen). Ich will hinzufügen, dass Sie prüfen, wie die Tabellen in der Realität erstellt wurden mit:

SHOW CREATE TABLE posts;

Die bisherigen Antworten mit dem Fremdschlüssel umgehen. Während die Fremdschlüssel auf jeden Fall nützlich ist referentielle Integrität, das Konzept des „Fremdschlüssels“ selbst ist von grundlegender Bedeutung für das relationale Modell von Daten zu erhalten, unabhängig davon, ob Sie die Einschränkung verwenden oder nicht.

Jedes Mal, wenn Sie tun, ein Equijoin , Sie sind gleich ein Fremdschlüssel für etwas, in der Regel der Schlüssel es verweist. Beispiel:

select *
from 
   Students
inner join
   StudentCourses
on Students.StudentId = StudentCourses.StudentId

StudentCourses.StudentId ist ein Fremdschlüssel Referenzierung Students.StudentId.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top