der henry: sql (mariadb) trigger

Hallo,

ich suche schon seit Stunden nach meinem Fehler. Ich habe ein Initialisierungsscript für meine Datenbank, das ich um einen Trigger erweitern will.

CREATE DEFINER=`root`@`%` TRIGGER `trigg_change_datapoints` 
    AFTER UPDATE ON `datapoints` 
      FOR EACH ROW
           UPDATE plclist 
           SET `CHANGE` = 1
           WHERE plcname = NEW.plcname   

macht was es soll ... passt.

Nun möchte ich aber nur das "update plclist" ausführen, wenn bestimmte Spalten sich geändert haben.

CREATE DEFINER=`root`@`%` TRIGGER `trigg_change_datapoints` 
AFTER UPDATE ON datapoints
FOR EACH ROW
BEGIN
    IF NOT (NEW.plcvarname <=> OLD.plcvarname)
       OR NOT (NEW.issymbol <=> OLD.issymbol)
    THEN
        UPDATE plclist
        SET `change` = 1
        WHERE plcname = NEW.plcname;
    END IF;
END

Hier kommt eine Fehlermeldung ERROR 1064, aber ich habe doch schon alles mit backticks ausgeführt.

Ich komme hier nicht weiter ....

Danke !!!

akzeptierte Antworten

  1. Hallo der henry,

    Den <=> Operator kenne ich in SQL nicht, nur in PHP.

    Ungleich ist <> oder !=. Und die Kombi mit NOT dürfte falsch sein, entweder (NOT a=b) OR (NOT c=d) oder (a<>b) OR (c<>d) oder NOT (a=b AND c=d)

    Boolesche Algebra kann ein Biest sein, vor allem wenn die De Morgan Regeln und Spiel kommen.

    Ich muss meinen Artikel über Boolesche Algebra endlich mal ins Wiki bringen...

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo der henry,

      Den <=> Operator kenne ich in SQL nicht, nur in PHP.

      Ungleich ist <> oder !=. Und die Kombi mit NOT dürfte falsch sein, entweder (NOT a=b) OR (NOT c=d) oder (a<>b) OR (c<>d) oder NOT (a=b AND c=d)

      Boolesche Algebra kann ein Biest sein, vor allem wenn die De Morgan Regeln und Spiel kommen.

      Ich muss meinen Artikel über Boolesche Algebra endlich mal ins Wiki bringen...

      Rolf

      Hallo Rolf,

      ja du hattest Recht Operator war falsch, hatte ich aus dem Internet teilweise übernommen,und einfach weiter 😉

      Fehlermeldung ERROR 1064 bleibt aber

      CREATE DEFINER=`root`@`%` TRIGGER `trigg_change_datapoints` 
      AFTER UPDATE ON datapoints
      FOR EACH ROW
      BEGIN
          IF  NEW.plcvarname != OLD.plcvarname
             OR NEW.issymbol != OLD.issymbol
          THEN
              UPDATE plclist
              SET `change` = 1
              WHERE plcname = NEW.plcname;
          END IF;
      END
      
      1. Hallo der henry,

        ich mache das zu selten und muss auch immer nachgucken, aber ich denke, die Semikolons stören. Lass die mal alle weg. Sie beenden das Statement zu früh, glaube ich.

        Rolf

        --
        sumpsi - posui - obstruxi
  2. Hallo,

    macht es einen Unterschied, ob

    `change`
    

    oder

    `CHANGE`
    

    auf 1 gesetzt wird?

    Gruß
    Kalk

  3. Hi,

    CREATE DEFINER=`root`@`%` TRIGGER `trigg_change_datapoints` 
    AFTER UPDATE ON datapoints
    FOR EACH ROW
    BEGIN
        IF NOT (NEW.plcvarname <=> OLD.plcvarname)
           OR NOT (NEW.issymbol <=> OLD.issymbol)
        THEN
            UPDATE plclist
            SET `change` = 1
            WHERE plcname = NEW.plcname;
        END IF;
    END
    

    Hier kommt eine Fehlermeldung ERROR 1064, aber ich habe doch schon alles mit backticks ausgeführt.

    Problem ist, daß das ; als Default-Delimiter das CREATE-Statement beendet.

    Vorher ein

    Delimiter $$
    

    und danach noch ein

    $$
    Delimiter ; 
    

    sollte helfen. Das erste setzt den Statement-Delimiter auf $$. Das $$ im zweiten Teil beendet dann das Create-Statement. Und die letzte Zeile setzt den Statement-Delimiter wieder auf den Strichpunkt.

    cu,
    Andreas a/k/a MudGuard

    1. Hi,

      Delimiter $$
      

      PS: statt $$ kannst Du auch eine beliebige andere Zeichenfolge (ohne Whitespace) nehmen, die nicht in Deinem CREATE-Statement vorkommt.

      cu,
      Andreas a/k/a MudGuard

      1. Vielen Dank MudGuard, vielen Dank an die anderen 💪

        Am "Delimiter" lag es, deshalb hat das kurze Script auch funktioniert. Hatte ich bis jetzt noch nie auf dem Schirm.

        Nochmals Danke