daniel_bln Geschrieben 29. April 2010 Teilen Geschrieben 29. April 2010 Guten Abend, ich habe momentan ein Problem beim Löschen von Datensätzen. Ich arbeite mit einer MySQL Datenbank und habe zwei Tabellen: Zum einen diese: Tabelle 1: |ID|IDNr|.... ID und IDNr sind Unique. Es können mehrere Einträge für eine ID existieren, wobei dann immer die IDNr unterschiedlich ist. Dann habe ich noch eine andere Tabelle: |ID|lang|... ID ist hier primary key und gleichzeitig ein fremdschlüssel auf die ID der ersten Tabelle. Sobald eine Zeile aus der ersten Tabelle gelöscht wird, sodass die gelöschte ID in der gesamten Tabelle nicht mehr existiert, soll der zugehörige Datensatz in der 2.Tabelle für die entsprechende ID auch gelöscht werden. Habe das mal mit On DELETE CASCADE probiert nur ist das Problem hier, dass er nach jedem gelöschten Datensatz in der ersten Tabelle den entsprechenden Datensatz in der zweiten Tabelle gelöscht hat, obwohl die ID in der ersten Tabelle noch existieren könnte. Er sollte also bevor den Datensatz des Fremdschlüssels löscht erst einmal überprüfen, dass es keinen Datensatz mehr mit der ID in der ersten Tabelle gibt und erst dann sollte er in die zweite Tabelle reingehen und löschen. Ich würde On Delete Cascade also gerne irgendwie erweitern oder existiert für sowetwas schon eine Funktion?? Oder muss ich das mit einerm Trigger machen? Wenn ja wie würde das ungefähr aussehen? Wie müsste ich dann vorgehen? Hoffe habe mich verständlich ausgedrückt wo das Problem liegt. liebe Grüße daniel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 30. April 2010 Teilen Geschrieben 30. April 2010 Ich würde On Delete Cascade also gerne irgendwie erweitern oder existiert für sowetwas schon eine Funktion?? also ganz speziell für das problem gibt es meines wissens nach nichts. Das CONSTRAINT selbst gibt das auch nicht her, aber helfen würde dir hier ein TRIGGER -> MySQL :: MySQL 5.1 Reference Manual :: 12.1.19 CREATE TRIGGER Syntax Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
daniel_bln Geschrieben 30. April 2010 Autor Teilen Geschrieben 30. April 2010 meinste das geht mit einem Trigger ja? Der Trigger müsste nach jedem gelöschten Satz in der ersten Tabelle. Schauen, ob es noch ein eintrag mit dieser id gibt und wenn nicht in der anderen Tabelle löschen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 30. April 2010 Teilen Geschrieben 30. April 2010 warum nicht? die ID der gelöschten zeile erhälst du mit OLD.ID damit kannst du ja dann prüfen ob es noch datensätze mit dieser ID gibt und entsprechend handeln. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
daniel_bln Geschrieben 30. April 2010 Autor Teilen Geschrieben 30. April 2010 okay, danke für deine hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 1. Mai 2010 Teilen Geschrieben 1. Mai 2010 die ID der gelöschten zeile erhälst du mit OLD.ID damit kannst du ja dann prüfen ob es noch datensätze mit dieser ID gibt und entsprechend handeln. Mag sein, dass mysql das vielleicht (noch) erlaubt, jede andere vernünftige Datenbank wird beim Versuch aus einem Row Level Trigger auf Tabelle A in Tabelle A zu selektieren einen Fehler werfen. Damit ist dieser Vorschlag nicht umsetzbar (im übrigen sollte keine fachliche Logik in einem Trigger abgelegt werden, auch wenn diverse Forenmitglieder dies aufgrund von Bücherwissen befürworten). Eine solche Löschlogik lässt sich entweder durch eine entsprechend programmierte Zugriffsschicht lösen, die dann aber auch mit Sperren arbeiten muss, damit man in einem Multiusersystem keinen fachlich inkonsistenten Zustand erhält, oder aber man hat einen Aufräumjob, der die im Laufe des Tages angefallenen Leichen zu definierten Zeiträumen entfernt. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
daniel_bln Geschrieben 14. Mai 2010 Autor Teilen Geschrieben 14. Mai 2010 hi, ich habe jetzt einen entsprechenden Trigger gebastelt. Es ist irgendein Syntaxfehler in dem mySQL Trigger drin, den ich schon seit Tagen versuchen zu beheben. Ich finde ihn nur leider nicht. DROP TRIGGER IF EXISTS my_Trigger; CREATE TRIGGER my_Trigger AFTER delete ON dierk.catchword FOR EACH ROW BEGIN if ((select COUNT(*) From catchword WHERE catchwordID = old.catchwordID) = 0) THEN delete FROM translatecword WHERE catchWordID = old.catchwordID END IF; END; Weiß vielleicht jemand von euch wo der syntaxfehler liegt?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
daniel_bln Geschrieben 14. Mai 2010 Autor Teilen Geschrieben 14. Mai 2010 Mag sein, dass mysql das vielleicht (noch) erlaubt, jede andere vernünftige Datenbank wird beim Versuch aus einem Row Level Trigger auf Tabelle A in Tabelle A zu selektieren einen Fehler werfen. Dim Kann es daran liegen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.