sql (mariadb) trigger
der henry
- mysql
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 !!!
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 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)oderNOT (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
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
Hallo,
macht es einen Unterschied, ob
`change`
oder
`CHANGE`
auf 1 gesetzt wird?
Gruß
Kalk
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; ENDHier 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
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
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