MySQL Conditional Insert

Astrodan

Gamma Cephei
ID: 119839
L
10 Dezember 2006
1.113
209
Servus!

ich hab jetzt schon ne Weile das Internet durchwühlt auf der Suche nach einer Lösung, aber finde nichts, was ich für angemessen halte. Also, was ich versuche ist ein wenig Arbeit von meinem PHP Skript an die Datenbank zu verlagern..
An einer Stelle komme ich aber nicht weiter:

Wenn in eine Tabelle ("gallery") eine neue Zeile eingefügt wird, soll in eine andere Tabelle ("pictureusers") ebenfalls eine Zeile eingefügt werden. Aber nur, falls in der neuen Zeile das Feld "cover" != -1 ist.

Den entsprechenden INSERT Query auszuführen ist per Trigger kein Problem, was ich aber nicht schaffe ist die Überprüfung.
Lösungen im Internet gehen über temporäre Tabellen, was ich für ein wenig übertrieben halte.
Meine Idee war dann über PREPARE .. FROM IF(expr, 'INSERT [...]'), aber das akzeptiert wohl keine Funktionen (oder jedenfalls kein If).
Letzte Lösung wäre das einfach einzufügen, und dann auf die pictureusers Tabelle einen Trigger, der bei einem INSERT ein DELETE WHERE SELECT spalte = -1 ausführt, d.h. die entsprechenden Zeilen wieder löscht. Das Ergebnis wären vermutlich ein vielfaches der nötigen Queries..

Also wäre die Frage: Gibt es eine sinnvolle Möglichkeit so etwas zu machen, oder sollte ich die Arbeit doch lieber bei PHP belassen?
 
Schau dir mal im MySQL-Handbuch den Zweig zu CASE an.
Damit kannst du wenn - dann Teile im mysql 'programmieren'.

In Version 5 von mysql kann das die DB, ob in der 4er auch weiss ich jetzt nicht.
 
Zuletzt bearbeitet:
Nicht zuviel Arbeit an die DB auslagern ;)
Wenn es sinnvoll ist, tu es, aber das scheint mir hier nicht der Fall, zumal es nur über Hacks lösbar scheint.

Ich vermeide Trigger zum Beispiel komplett, denn dem Sourcecode tut das gar nicht gut, wenn unsichtbar noch irgendwo Daten geändert werden, man muss jedesmal an 2 Stellen suchen, im Code und in Triggern/Stored-Procedures der DB, wie schnell hat man mal vergessen in der DB nachzusehen.
 
Könntest Du den Trigger so formulieren:


PHP:
CREATE TRIGGER name
AFTER INSERT ON gallery
FOR EACH ROW BEGIN

INSERT INTO pictureusers
SELECT wert1,wert2,wert3 ...
FROM DUAL
WHERE new.cover != -1;

END;

dann würde in die pictureusers eine Zeile mit den Werten eingefügt werden, wenn cover != -1 ist, und eine leere Menge ( also nichts ), wenn cover den Wert -1 hat
 
So, dann meld ich mich mal wieder ;)

Die Antwort von justme89 hats schon getan, hab nur bis jetzt gebraucht das effektiv umzusetzen (Hab die Trigger über PhpMyAdmin eingegeben, und das zickt da manchmal was rum). Mein Problem war, dass ich nur zur Case expression, aber nicht zum statement vorgedrungen bin.. sonderlich übersichtlich ist das Manual da nicht. :roll:

@ice-breaker: Sicher, man sieht im PHP Code nicht mehr, wenn da was passiert, aber es erspart mir einen Haufen Queries, die ich von PHP an MySQL senden müsste. Außerdem werde ich mir Kommentare in die Skripte schreiben, die das anmerken

Bezüglich der letzten Idee: Das ist im Prinzip das, wo auch der Ansatz der temporären Tabellen drauf basierte ;). Problem ist nur, dass ich dieses SELECT nicht ausführen kann, da sowohl Daten übernommen als auch neu zusammengesetzt werden müssen..

Aber letztlich hab ichs jetzt hingekriegt. Und alle die das auch mal probieren wollen: In PhpMyAdmin den Delimiter auf $$ oder %% setzten, um das mehrzeilige hinzukriegen.. hab auch andere probiert, aber hin und wieder weigert der sich