ich bräuchte mal ein wenig Hilfe von den SQL-Erfahrenen unter euch.
Ich habe heute ein Buch über SQL gekauft (das hier), und mich gleich mal mit den Fremdschlüsseln beschaäftigt.
Wenn ich das Buch richtig verstehe, bewirkt ein Fremndschlüssel, dass sobald der Wert des Referenzschlüssels geändert oder gelöscht wird, auch der Wert von dem Fremdschlüssel in der anderen Tabelle geändert wird, um die referenzielle Intergrität zu bewahren.
Ich habe nun 3 Tabellen, produkte, kunden und bestellungen.
Die Tabelle bestellungen sieht so aus:
CREATE TABLE bestellungen(
bst_id INT( 5 ) NOT NULL AUTO_INCREMENT ,
kdn_id INT( 5 ) NOT NULL DEFAULT 0,
pdct_id INT( 5 ) NOT NULL ,
PRIMARY KEY ( bst_id ) ,
FOREIGN KEY ( kdn_id ) REFERENCES kunden( kdn_id ) ON UPDATE CASCADE ON DELETE SET DEFAULT,
FOREIGN KEY ( pdct_id ) REFERENCES produkte( pdct_id ) ON UPDATE CASCADE ON DELETE CASCADE
)
Ihc habe mir 10 Produkte angelegt, 5 Kunden und dann 5 Bestellungen.
Wenn ich aber nun das Produkt mit ID 9 lösche, wird nicht - wie ich es jetzt erwartet hätte - automatisch die Bestellung gelöscht.
Woran liegt das? Habe ich das Prinzip falsch verstanden, oder unterstützt MySQL das einfach nicht?
Habe ich irgendwo einen Fehler?
Heisst auf deutsch, das MySQL das schlicht nicht unterstützt, bzw. nur, wenn man InnoDB als Engine benutzt??
Wie siehts mit PostGre SQL aus? unterstützt das FOREIGN KEY?.
PS: Im Buch stand, das das von MySQL unterstützt wird, aber, so wörtlich „nicht bei allen Tabellentypen“. Mit Tabellentypen sind dann also die StorageEngines gemeint?
EDIT: Ja, sind sie
Danke soweit schonmal…
EDIT: Kann ich den Typ einer tabelle den einfach Konvertieren, oder geht mir dabei die Tabelle flöten? Und: Kann ich InnoDB irgendwie als Standart festlegen?
Leider habe ich festgestellt, das INNODB unter MySQL Fremdschlüssel zwar unterstützt, aber nur begrenzt. Er überwacht dann nur, das man nix löschen oder ändern kann, was zu Inkonsitenz führt. Aotomatische Aktionen, die zb. von FireBird unterstützt werden gehn leider nicht - schade, für ein so bekanntes und oft benutztes DB-System.
Ich mahce mich jetzt mal auf die Suche in der PgSQL-Man, in der Hoffnung, dort was brauchbares vorzufinden.
EDIT: Zumindest steht in der Doc nichts negatives von wegen nur parsen oder so.
Im praxistest arbeitet es allerdings noch nicht so, wie ich es gerne hätte…