Beim erstellen folgenden Triggers erhalte ich immer eine Fehlermeldung aber ich versteh nicht was daran falsch sein soll:
"
CREATE TRIGGER ric_test
AFTER INSERT ON monitord_pocsag
FOR EACH ROW
BEGIN
INSERT INTO monitord_pocsag (kennung) VALUES (‚1234‘)
END
"
monitord_pocsag gibt es als tabelle und dort existiert auch die Spalte kennung
die meldung lautet:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚END‘ at line 6
CREATE TRIGGER ric_test
AFTER INSERT ON monitord_pocsag
FOR EACH ROW
BEGIN
INSERT INTO monitord_pocsag (kennung) VALUES (‚1234‘)
END
"
monitord_pocsag gibt es als tabelle und dort existiert auch
die Spalte kennung
die meldung lautet:
#1064 - You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right
syntax to use near ‚END‘ at line 6
Ohne jetzt MySQL besser zu kennen, kann das nicht funktionieren.
Warum? Nach einem Insert auf eine Tabelle soll noch ein Insert auf diese Tabelle gemacht werden -> Endlosschleife.
Unter Oracle kommt wenigstens das grandiose „Table is mutating“
Außerdem fehlt ein Strichpunkt - dann könnte es sein, das MySQL das so akzeptiert und wirklich nur das Trigger-Insert hinterherschießt und für dieses Insert den Trigger nimmer aufruft …
CREATE TRIGGER ric_testttt
AFTER DELETE ON test
FOR EACH ROW
INSERT INTO datum (datum) VALUES (‚2011-11-01‘)
Wie würde sich in MySQL ein
create trigger test\_tr
after insert on test
for each row
insert into test ('bla')
verhalten??
Also so, wie’s in der Ursprungsfrage vorhanden war?
Vom logischen her eigentlich ein klassisches „Mutating“ (zumindest dann beim Insert, also wenn der Trigger so richtig zuschlagen möchte)
create trigger test_tr
after insert on test
for each row
insert into test (‚bla‘)
verhalten??
Also so, wie’s in der Ursprungsfrage vorhanden war?
Vom logischen her eigentlich ein klassisches „Mutating“
(zumindest dann beim Insert, also wenn der Trigger so richtig
zuschlagen möchte)
endloschleifen verhalten sich immer endlos , abgesehen das es wohl garnicht erst passiert , weils nicht geht
Fehler
SQL-Befehl: Bearbeiten
INSERT INTO helptheworld.datum ( datum
)
VALUES (
‚2011-05-11‘
)
MySQL meldet: Dokumentation #1442 - Can’t update table ‚datum‘ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
MySQL meldet: Dokumentation #1442 - Can’t update table ‚datum‘ in stored function/trigger
because it is already used by statement which invoked this
stored function/trigger.
Genau sowas meinte ich, dass sogar unter MySQL in einem Tabellentrigger dieselbe Tabelle nicht manipuliert werden kann.
(Hätte ja auch sein können, dass der Trigger nur bei einem „äußeren“ Insert zuschlägt, beim „inneren“ nicht)
okay vielen dank schonmal das mit dem endlosschleife und den delimitern habe ich nun soweit verstanden und konnte den trigger auch anlgegen
auch mit der if abfrage dort lag der fehler am delimiter
jetzt noch eine frage wenn der trigger nicht eingerichtet
kann ich den Insert auf monitord_pocsag ohne probleme auch nur mit einem Value machen also:
INSERT INTO monitord_pocsag (kennung) VALUES (1)
wenn der Trigger:
"
DELIMITER //
CREATE TRIGGER RIC_TEST AFTER INSERT ON monitord_pocsag
FOR EACH ROW
BEGIN
IF ((SELECT * FROM orga WHERE RIC = new.kennung)=NULL) THEN
INSERT INTO orga (RIC,unknown) VALUES (new.kennung,true);
END IF;
END;//
"
eingerichtet ist kommt beim INSERT immer die Fehlermeldung:
" #1241 - Operand should contain 8 collumn(s)"
wieso möchte der wenn der trigger aktiv ist werte für alle 8 spalten
Die Struktur von monitord_pocsag ist:
"
id int(10) UNSIGNED Nein Kein AUTO_INCREMENT
uhrzeit datetime Nein Kein
kennung varchar(45) latin1_german1_ci Nein Kein
sub varchar(45) latin1_german1_ci Nein Kein
text varchar(500) latin1_german1_ci Nein Kein
quelle tinyint(2) UNSIGNED Nein Kein
"
die für orga
"
organisation varchar(50) latin1_german1_ci Nein Kein
Gemeinde varchar(50) latin1_swedish_ci Nein Kein
Standort varchar(40) latin1_swedish_ci Nein Kein
Einheit varchar(30) latin1_swedish_ci Nein Kein
RIC int(8) Nein Kein
keywords varchar(10) latin1_german1_ci Nein Kein
text_settings varchar(30) latin1_swedish_ci Nein Kein
unknown tinyint(1) Nein Kein
"
IF ((SELECT * FROM orga WHERE RIC = new.kennung)=NULL) THEN
INSERT INTO orga (RIC,unknown) VALUES (new.kennung,true);
END IF;
END;//
"
Mir erschliesst sich dein vergleich mit NULL nicht .
das hier
DELIMITER #
CREATE TRIGGER testins AFTER INSERT ON test
FOR EACH ROW
IF ((SELECT NULL,NULL,NULL FROM anschluss WHERE 5 = 5 ) = NULL) THEN
insert into datum (datum) values(‚2011-11-14‘);
END IF;
ergibt die Ffehlermeldung operant , also das = , brauch 3 werte
DELIMITER #
CREATE TRIGGER testins AFTER INSERT ON test
FOR EACH ROW
IF ((SELECT NULL FROM anschluss WHERE AnschlussID = 1 ) = NULL) THEN
insert into datum (datum) values(NOW());
END IF;
aber warum vergleich mit NULL ?
? Ist der Feldwert gleich NULL bei AnschlussID = 1 und soll dann was getan werden ?
? Oder wolltest du prüfen ob kein Datensatz gefunden wird und dann einen eintrag machen ?
genau ich will wissen ob der eintrag „neu.kennung“ schon in der liste vorhanden ist und wenn das nicht der fall ist ist das ergebnis der abfrage = null und der eintrag soll hinzugefügt werden, damit will ich sicher gehen, dass ich alle kennungen die in monitor_pocsag hinzugefügt werden auch in orga zur Verfügung habe