Anfängerproblem Trigger

Martin1968

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich habe nach Jahren der Abstinenz wieder mit einer Datenbank angefangen in der ich mit Hilfe eines Triggers ein Kennzeichen pro Datensatz ermitteln möchte, dass sich aus der aktuellen Jahreszahl, einem Seperator ('-') und einer fortlaufenden Nummer zusammensetzt.

Ich habe versucht einen Trigger vom Typ BEFORE INSERT zu erstellen, erhalte aber immer wieder den Hinweis, dass die SQL-Syntax fehlerhaft ist - inzwischen bin ich einigermaßen deprimiert und hoffe auf Eure Hilfe. Was mache ich falsch?

DELIMITER //
CREATE TRIGGER generate_Vergabenummer
BEFORE INSERT
ON tbl_Pr_Vergaben
FOR EACH ROW
BEGIN
SET NEW.Vergabenummer=select CONCAT(year(now()),'-',(select count(id_Pr_Vergabe) from tbl_Pr_Vergaben where left(Vergabenummer,4)=year(now()))+1)
END;//
DELIMITER ;

Es wäre toll, wenn Ihr mir auftue Sprünge helfen könntet.

Gruß

Martin
 
Werbung:
Warum einen TRIGGER, warum nicht in der Abfrage? Was passiert, wenn Datensätze gelöscht werden? Dann knallt wohl dein count(...), oder? Was passiert, wenn da mal 6 Milliarden Rows drin sind in der Tabelle, dann dauert Dein count() ewig und Du kannst kaum noch was inserten in die Tabelle...
 
Als Ergänzung dazu:
Man bastelt keine Felder in separaten Spalten zusammen, die dann Gefahr laufen, ungültig zu werden.
Sowas macht man "on the fly", also z.B. im Select für den Report oder Formular..

Dein Vorteil dabei wäre, der (jetzt noch) fehlerhafte Code dampft dabei auf eine Expression zusammen, die irgendwo in Deinem zukünftigen Select stecken sollte:
Select ..., CONCAT(year(now()),'-',(select count(id_Pr_Vergabe) as VergabeNR, ..
Vielleicht verschwindet dann schon der Fehler.

Wie lautet er überhaupt?

Inhaltlich ändert dieser Umbau erstmal auch nichts daran, dass der Count ziemlich "kostet". Man würde da nichts zählen und sich dieser Zahl "hingegeben", sondern bspw. mit einem Generator eindeutige Nummern produzieren. (Im Detail hängt der genaue Aufbau oder Algorithmus dafür natürlich von Anforderungen ab, die hier jetzt nicht bekannt sind.)
 
Werbung:
Warum einen TRIGGER, warum nicht in der Abfrage? Was passiert, wenn Datensätze gelöscht werden? Dann knallt wohl dein count(...), oder? Was passiert, wenn da mal 6 Milliarden Rows drin sind in der Tabelle, dann dauert Dein count() ewig und Du kannst kaum noch was inserten in die Tabelle...

Vielen Dank für Deinen Beitrag, der mein Problem leider nicht löst. Die Tabelle wird keine Millionen, sondern maximal 50 Einträge p.a. umfassen. Die erzeugte Nummerierung wird auf Dokumenten verwendet und muss deshalb Bestand haben. Ich nutze einen Generator für eine Weboberfläche, der meine Auswertungsmöglichkeiten einschränkt, alles Dinge, die Du nicht wissen konntest, aber die dazu führen, dass ich den Trigger so brauche wie ich ihn formuliert habe - inzwischen habe ich ein fehlendes Semikolon alsFehlerursache identifiziert.

gruß

Martin
 
Zurück
Oben