MySQL und Foreign Key's wie bei Oracle?

Radhad

Erfahrenes Mitglied
Hi zusammen,

gestern hab ich mit einem Bekannten etwas diskutiert über ein Datenbankschema. Dabei kam die Frage auf, ob man in MySQL ebenfalls wie in Oracle einen Foreign Key anlegen kann, damit sich die Datenbank darum kümmert und nicht die Programmier-/Scriptsprache.

Bei Oracle sieht das ja wie hier in dem Beispiel aus: http://www.datenbank-sql.de/oracle-constraints.htm

Wie sähe das bei MySQL aus, falls das geht? Gibt es irgendwelche Einschränkungen?


gruß Radhad
 
Hätte ich mal besser gleich in der englischen Dokumentation geschaut - in der deutschen ist das irgendwie unlogisch geschrieben. Wie es scheint, funktioniert es genauso wie in Oracle.

Das "ON DELETE CASCADE" löscht auch alle Child-Einträge, richtig?

Nehmen wir jetzt mal an, man hätte eine Website mit Blogs sowie einem Forum. Dann würde ich für den Blog, den User X erstellt hat, ON DELETE CASCADE verwenden und in den Forenbeiträgen "SET NULL"? Denn sowas sollte dann ja mit in die Planung aufgenommen werden - denn es vereinfacht eventuelle Löschvorgänge erheblich...


PS: muss ich Engine = InooDB schreiben? Und ein Index muss auch gesetzt werden?
 
Ich hab das jetzt mal ein wenig studiert im Manual und wollte mal Fragen, ob hier jemand einen logischen Fehler entdeckt oder ob meine Überlegungen ok / gut sind. Ich hab das ganze mal wie bei einem Forum gemacht. Über Kritik würd ich mich freuen :)
SQL:
CREATE TABLE Users (
	UserID INT(255) NOT NULL AUTO_INCREMENT,
	Username VARCHAR(255) NOT NULL UNIQUE,
	PRIMARY KEY(userid)
) ENGINE = INNODB;

CREATE TABLE Forums (
	ForumID INT(255) NOT NULL AUTO_INCREMENT,
	Forumname VARCHAR(255) NOT NULL,
	ParentForumID INT(255),
	PRIMARY KEY(ForumID),
	FOREIGN KEY(ParentForumID) REFERENCES Forum(ForumID)
) ENGINE = INNODB;

CREATE TABLE ForumModerators (
	ForumID INT(255) NOT NULL,
	UserID INT(255) NOT NULL,
	PRIMARY KEY(ForumID, UserID),
	FOREIGN KEY(ForumID) REFERENCES Forums(ForumID) ON DELETE CASCADE,
	FOREIGN KEY(UserID) REFERENCES Users(UserID) ON DELETE CASCADE
) ENGINE = INNODB;

CREATE TABLE Threads (
	ThreadID INT(255) NOT NULL AUTO_INCREMENT,
	Title VARCHAR(255) NOT NULL,
	CreateDate DATE NOT NULL,
	CreateTimestamp INT(255) NOT NULL,
	CreatedBy INT(255),
	ForumID INT(255) NOT NULL,
	PRIMARY KEY(ThreadID),
	FOREIGN KEY(Createdby) REFERENCES Users(UserID) ON DELETE SET NULL,
	FOREIGN KEY(ForumID) REFERENCES Forum(ForumID) ON DELETE CASCADE
) ENGINE = INNODB;

CREATE TABLE Posts (
	PostID INT(255) NOT NULL AUTO_INCREMENT,
	Text TEXT NOT NULL,
	CreateDate DATE NOT NULL,
	CreatedBy INT(255),
	LastModifiedBy INT(255),
	ThreadID INT(255) NOT NULL,
	PRIMARY KEY(PostID),
	FOREIGN KEY(CreatedBy) REFERENCES Users(UserID) ON DELETE SET NULL,
	FOREIGN KEY(LastModifiedBy) REFERENCES Users(UserID) ON DELETE SET NULL,
	FOREIGN KEY(ThreadID) REFERENCES Threads(ThreadID) ON DELETE CASCADE
) ENGINE = INNODB;
Gruß Radhad

PS: Das ist nur ein Auszug aus meinen Überlegungen - allerdings der, wo sich am meisten was ändert.
PPS: Das SQL-Highlighting wär noch ne Überlegung Wert - beim Notepad++ ist das ganz hilfreich!

[EDIT]
Anscheinend klappt das nicht mit der aktuellen XAMPP-Version - Abhängigkeiten werden nicht berücksichtigt und "ON DELETE CASCADE"-Anweidungen werden auch nicht ausgeführt... Wo ist der Fehler? - INDEX'es habe ich eingefügt, sind hier aber nicht zu sehen.
 
Zuletzt bearbeitet:
Zurück