Trigger oder PHP

Darian

Erfahrenes Mitglied
Hallo Leute,

folgendes Problem:

Eine Tabelle hat eine Spalte SortID, und wenn ich jetzt einen neuen Datensatz erstelle, soll die SortID natürlich gleich der ID sein.

Aber in PHP selbst weiß ich ja die ID noch gar nicht, da sie ja auto inrement ist.

Zwei Möglichkeiten:

1. Ich versuche vorher mit einer PHP Abfrage die nächste ID raus zu finden. Wobei ich da Sachen wie max() vergessen kann, weil ja auto increment schön höher wie die letzte id sein könnte (wenn Sätze gelöscht wurden) Müsste daher direkt irgenwie auto increment raus lesen.

Das könnte schön möglich sein, weil man es ja auch mit SQL umsetzen kann.

2. Ich schreibe zum ersten mal in meinem Leben einen Trigger, der das beim erstellen eines Datensatzes automatisch macht. Da habe ich noch eher keine Ahnung wie.

Wie würdet ihr das machen?

lg und danke für eventuelle Infos
Darian
 
Ehrlich?
Ich würde mir per [phpf]mysqli_insert_id[/phpf] die letzte ID holen und den Datensatz aktualisieren per UPDATE.
 
Geht also einfach auch. :-)

Ja, dann probiere ich es so. Dachte mit einem Trigger wäre das sicher super zu lösen. Und habe in letzter Zeit mehr die Tendenz alles wenn möglich mit sql zu lösen :-)

Passt aber, so probiere ich es mal.

Danke dir.

lg Darian
 
Hallo Leute,

ich habe mir das jetzt überlegt, und würde es einfach so um was neues dazu zu lernen doch lieber mit Trigger probieren.

Aber warum funktioniert der nicht?

Code:
CREATE TRIGGER set_sortid AFTER INSERT ON de_travel
BEGIN
UPDATE de_travel SET NEW.sortid = NEW.id;
END;

Freue mich über jede Hilfe.

lg Darian
 
Hi Darian,

sowas ist doch mit einem Trigger super zu lösen. Ich würde es auch nicht wie Felix meint im nachhinein mit PHP machen.

Du hast zwar nicht gesagt welches DB Verwaltungssystem du benutzt, es wird wahrscheinlich MySQL sein nehm ich mal an - wenn nicht, dann sag nochmal bescheid. Die Syntax für das Erstellen von Triggern ist nämlich auf verschiedenen DB unterschiedlich.

Wie man es bei MySQL macht kann man hier gut nachlesen.

Dein Ansatz ist nicht schlecht, ich würde es allerdings an ein paar Stellen anders machen. Ich würde den Trigger vor dem Eintragen abfeuern - also BEFORE INSERT ON anstatt AFTER INSERT ON. Dann brauchst Du auch kein UPDATE, sondern sagst einfach SET NEW.sortid = NEW.id - das reicht.
Was deinem Trigger dann noch fehlt ist ein FOR EACH ROW, der gehört bei MySQL einfach dazu ;)
Da der Trigger nur eine Anweisung macht brauchst du auch kein BEGIN und END. So könnte das dann ausehen:

Code:
CREATE TRIGGER set_sortid 
BEFORE INSERT ON de_travel
FOR EACH ROW
SET NEW.sortid = NEW.id;

Falls du doch mehrere Anweisung mal benutzt in deinem Trigger und deshalb mit BEGIN und END arbeiten musst, dann denk daran vorher das Trennzeichen von ; in ein anderes Zeichen umzuändern, z.B in ein | (mit delimiter |). Das ist alles auch auf der Seite (Link oben) nachzulesen.

Gruß
 
Hallo,

ja danke für die Infos, wollte es gerade probieren, nur gehen mir da die Rechte ab, muss mich jetzt mal in so ein backend einloggen, und mal die Rechte checken.

Ich gebe dann noch Infos ob es funktioniert hat. Aber schaut gut aus. :-)

lg Darian
 
Hallo Leute,

danke für eure Hilfe, es war wirklich sehr hilfreich.

Habe gerade mit dem Support geredet, und folgendes als Antwort bekommen:

Please accep my appologation but we don't provide super priveledges to database.

Und genau diese bräuchte ich um Trigger zu erstellen. (zumindest bei mysql 5)

Sie meinten zwar ich kann ein Ticket erstellen, aber dann wäre ich wenn eine neue Sprache dazu kommt, wieder von denen abhängig.

Es sei denn ich kann es irgendwie so machen dass diese Regel für alle Tabellen xxx_travel gilt. (derzeit habe ich nur de_travel und eng_travel)

Wenn das möglich wäre, wäre das natürlich optimal. Dann erstellen mir die Admins den Trigger, und schon würde es auch für die Zukunft funktionieren.

lg und danke für die Hilfe bis jetzt
Darian
 
Zurück