Kaskadiertes löschen in MySQL?

2 Antworten

Du bist schon auf dem richtigen Weg. Nur wird das nicht mit der DELETE-Anweisung beim Löschen gemacht, sondern schon beim Definieren der Tabelle, genauer beim Fremdschlüssel. Dort wird festgelegt, wie sich die Datenbank verhalten soll, wenn es mit dem Fremdschlüssel einen Konflikt gibt. Wenn man das dann dort definiert hat, wird beim Löschen immer und automatisch danach verfahren, nicht mal so und mal anders.

Hier ein Beispiel dazu aus einer CREATE TABLE - Anweisung:

     primary key (mgnr,recdat,recnr,kurz,pnr),
foreign key fkyre1 (mgnr)
references mitgl on delete cascade
on update cascade

Das ist auch eine Frage der Integrität, für die es in diesem Fall verschiede Modi geben kann. Man muss sich für einen entscheiden und die Datenbank handelt danach.

Man kann das auch nachträglich mit der ALTER-TABLE Anweisung machen. Nicht vergessen: Der bereits vorhandene Fremdschlüssel muss erst gelöscht werden. Zum Zeitpunkt des Eintrages darf die Tabelle keinen Konfliktfall vorab schon enthalten.

mySQL: Wenn ID vorhanden, dann Update sonst INSERT ... ... WIE geht das?

Hallo Zusammen! Ich bin sehr frustriert und ratlos! Meine Lieblingsmeldung seit Tagen: "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ..."

Ich habe so einen GPS-Tracker, da lese ich Daten aus bzw. der Tracker stellt diese Daten in einem CSV-File zur Verfügung! Jeder Datensatz hat eine eindeutige fortlaufende Nummer (Spalte: index). Nun habe ich ein PHP-Script geschrieben, was die Daten in eine mySQL-Tabelle einliest. NEUE GPS-Daten werden dem CSV-File mittels der fortlaufenden Nummer hinzugefügt. Manche GPS-Daten im CSV-File "springen aus der Reihe" und ich kann diese im CSV-File komfortabel löschen. In der Tabelle habe ich selbst noch die Spalte id als PrimaryKey AUTO_INCREMENT hinzugefügt und den index als Unique gekennzeichnet (PRIMARY KEY (id), UNIQUE KEY index (index)). Nun möchte ich nur die Daten einlesen, welche NEU im CSV-File hinzugekommen sind und die "alten" Daten updaten! Klingt einfach, aber ich verzweifle ... Ich habe mit EXISTS gespielt, IF THEN, ... =====1. Versuch===== INSERT INTO db.bt747 (id, index, rcr) VALUES (NULL,1,'TEST') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), index=1; =====2. Versuch===== BEGIN IF(SELECT COUNT() FROM db.bt747 WHERE db.bt747.index = 7)>0 THEN UPDATE db.bt747 SET rcr = 'FREDDY', date = '2014-07-08', time = '21:23:44', valid = 'TEST' WHERE db.bt747.index = 7; ELSE INSERT INTO db.bt747 (rcr,date, time,valid) VALUES ('SEPPEL','2033-12-24','22:23:24','HALLO'); END IF; END =====3. Versuch===== IF EXISTS(SELECT COUNT() FROM db.bt747 WHERE db.bt747.index = 7) THEN UPDATE db.bt747 SET rcr = 'FREDDY', date = '2014-07-08', time = '21:23:44', valid = 'TEST' WHERE db.bt747.index = 7; ELSE INSERT INTO db.bt747 (rcr,date, time,valid) VALUES ('SEPPEL','2033-12-24','22:23:24','HALLO'); END IF;

Wenn ich die einzelnen Selects (SELECT COUNT(*) ..., UPDATE ..., INSERT ...) ausführe, funktioniert es, aber im Zusammenspiel mit IF THEN, EXISTS, ON DUPLICATE KEY UPDATE kommt immer die Lieblingsmeldung ...

Wahrscheinlich eine Kleinigkeit, für jemanden der sich damit auskennt ...

VIELEN Dank für Eure Hilfe Gruss W.

...zur Frage

Was möchtest Du wissen?