Abhängigkeit zwischen zwei MySQL-Tabellen

Parantatatam

mag Cookies & Kekse
Hallo liebe Forumnutzer!

Bevor ihr euch fragt, warum ich hier im PHP-Forum eine Frage stelle, die doch mehr nach einem Datenbanksystem klingt, will ich euch sagen, dass genau dort das Problem meiner Frage liegt.

Stellt euch folgendes vor: ich habe zwei Tabellen in einer MySQL-Datenbank. Die erste ist jetzt eine Liste von Nutzern mit zugehöriger Nutzer-ID. In der zweiten stehen verschiedene Werte, die dann der Nutzer-ID zugeordnet werden. Soweit so gut. Wenn ich nun aber aus der ersten Tabelle einen Nutzer lösche, so sollen auch die Werte, die diesem Nutzer zugeordnet waren, gelöscht werden. Kann man so etwas direkt mit MySQL lösen? Wenn dem so sei, stellt sich noch eine Frage: Wie geht das? Ich habe so etwas leider noch nicht gesehen und würde es spontan mit PHP lösen.

Gebt meinem Wissensdurst Wasser, auf das er gestillt wird. Ich danke allen schon im Voraus, die mir helfen können.

Änderung: So schnell kann es passieren: Thema wurde in das Datenbankforum verschoben.
 
Zuletzt bearbeitet:
Danke, dass geht schon in die Richtung die ich gesucht habe. Ich habe nur folgendes Problem: ich bastel gerade an einem Vertretungsplan für meine Schule. Dabei habe ich teilweise eine Menge von Schlüsseln, welche ich mit Kommata getrennt in einem Feld vom Typ VARCHAR gespeichert habe. Jetzt möchte ich aber, dass im Falle das einer dieser Schlüssel gelöscht wird, dieser in dieser Menge gefunden wird und dieser dann aus der Menge gelöscht wird. Im Moment finde ich diesen Schlüssel mit RegEx und folgendem Query:
PHP:
mysql_query('SELECT * FROM `dat_timetable` WHERE `courses` REGEXP "^([0-9 ,]*, )*'.$id.'(, [0-9 ,]*)*$"');

Wie könnte ich das nun umsetzen?
 
An kuddeldaddeldu: Ich weiß, dass VARCHAR hier die falsche Lösung ist, aber was würdest du mir vorschlagen, was hier angebracht wäre? Das war bisher die beste Möglichkeit, die ich gefunden habe.
 
Hallo,

ich kenne dein Datenbankmodell nicht, aber ich nehme einfach mal folgendes an:
  • Jeder Eintrag der Tabelle dat_timetable steht mit beliebig vielen Einträgen aus der Tabelle courses in Beziehung.
  • Umgekehrt steht jeder Eintrag aus courses mit beliebig vielen Einträgen aus dat_timetable in Beziehung.
Das nennt man dann eine N:M-Relation. Um diese auf eine relationale Datenbank abzubilden, erzeugt man eine zusätzliche Tabelle. Diese enthält pro Zeile je einen Fremdschlüssel von dat_timetable und einen Fremdschlüssel von courses. Wenn du also vorher in der Spalte courses von dat_timetable den Wert "1,2,3,4" stehen hattest und der Fremdschlüssel der Zeile 1 ist, dann werden daraus die Einträge
Code:
timetable_id | course_id
-------------+----------
           1 |         1
           1 |         2
           1 |         3
           1 |         4
in der neuen Tabelle. In dieser kannst du dann auch den Fremdschlüssel Constraint anlegen.

Grüße, Matthias
 
Ich habe jetzt meine Tabellen normalisiert. Jetzt kommt aber ein Fehler, den ich mich nicht erklären kann: Fehler beim Erzeugen eines Fremdschlüssels für %1$s (überprüfen Sie die Datentypen) : id_teacher

Aktuell bastel ich mit drei Tabellen: eine für die Lehrer, eine für die Unterrichtsfächer und eine, die Beziehungen zwischen beiden Tabellen darstellt.
  • dat_teacher
  • dat_subject
  • rel_teacher_subject
Tabelle dat_teacher:
Code:
CREATE TABLE dat_subject (
  id smallint(5) unsigned zerofill NOT NULL auto_increment COMMENT 'ID',
  `subject` varchar(300) collate utf8_unicode_ci NOT NULL COMMENT 'Name des Unterrichtsfaches',
  short varchar(10) collate utf8_unicode_ci NOT NULL COMMENT 'Kürzel des Unterrichtsfaches',
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Liste aller Unterrichtsfächer';
Tabelle dat_subject:
Code:
CREATE TABLE dat_teacher (
  id smallint(5) unsigned zerofill NOT NULL auto_increment COMMENT 'ID',
  firstname varchar(300) collate utf8_unicode_ci NOT NULL COMMENT 'Vorname',
  lastname varchar(300) collate utf8_unicode_ci NOT NULL COMMENT 'Nachname',
  short varchar(10) collate utf8_unicode_ci NOT NULL COMMENT 'Kürzel',
  birthday date NOT NULL COMMENT 'Geburtstag',
  gender enum('male','female') collate utf8_unicode_ci NOT NULL COMMENT 'Geschlecht',
  `type` enum('teacher','trainee teacher') collate utf8_unicode_ci NOT NULL COMMENT 'Lehrer/Referendar',
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Liste aller Lehrer';
Tabelle rel_teacher_subject:
Code:
CREATE TABLE rel_teacher_subject (
  id_teacher smallint(6) NOT NULL,
  id_subject smallint(6) NOT NULL,
  KEY id_subject (id_subject),
  KEY id_teacher (id_teacher)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Ich weiß nicht, wo da ein Unterschied zwischen Datentypen existieren soll.
 
Ich habe jetzt meine Tabellen normalisiert. Jetzt kommt aber ein Fehler, den ich mich nicht erklären kann: Fehler beim Erzeugen eines Fremdschlüssels für %1$s (überprüfen Sie die Datentypen) : id_teacher
Bei welcher Abfrage kommt dieser Fehler? Ich kann die drei CREATE TABLE Anweisungen auf meinem Testsystem problemlos ausführen (MySQL 5.0.51a-24+lenny1). Mich verwundert auch, dass hier der Begriff "Fremdschlüssel" auftaucht, wo du doch noch überhaupt keinen definiert hast.

Grüße, Matthias
 
Es geht auch um die Erzeugung des Fremdschlüssels, was bedeutet, dass ich noch keinen erzeugt habe.

Das Problem trifft bei mir auf, wenn ich id_subject mit dat_subject.id oder id_teacher mit dat_teacher.id verbinden will.
Code:
ALTER TABLE  `rel_teacher_subject` ADD FOREIGN KEY (`id_teacher`) REFERENCES  `iSchedule`.`dat_teacher` (
`id`
);
 

Neue Beiträge

Zurück