Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Anfängerproblem Trigger

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Martin1968, 8 Juli 2020.

  1. Martin1968

    Martin1968 Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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...
     
  3. dabadepdu

    dabadepdu Datenbank-Guru

    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.)
     
  4. Martin1968

    Martin1968 Neuer Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden