Fehler beim erstellen eines Insert Triggers

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

Hi!

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“ :wink:

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 …

Grüße,
Tomh

Test :

DELIMITER $$
CREATE TRIGGER ric_testt
AFTER INSERT ON test
FOR EACH ROW
BEGIN
INSERT INTO datum (datum) VALUES (‚2011-11-01‘)
END$$
DELIMITER ;

error near END

DELIMITER $$
CREATE TRIGGER ric_testt
AFTER INSERT ON test
FOR EACH ROW
BEGIN
INSERT INTO datum (datum) VALUES (‚2011-11-01‘);
END$$
DELIMITER ;

success

nur ohne begin und end gehts mit keinem ; am ende

CREATE TRIGGER ric_testttt
AFTER DELETE ON test
FOR EACH ROW
INSERT INTO datum (datum) VALUES (‚2011-11-01‘)

success

Hi!

Rein aus Neugier:

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)

Grüße,
Tomh

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)

endloschleifen verhalten sich immer endlos , abgesehen das es wohl garnicht erst passiert , weils nicht geht :smile:

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.

Hi!

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)

Danke,
Tomh

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
"

nochmal vielen dank für die schnellen antworten

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

NULL,NULL,NULL = NULL

das ist error

was willst du denn eigentlich erreichen ?

das geht

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

dann brauchst du ja gar kein Feld sondern nur obs wahr wird

also auch nicht
IF ( (SELECT feldname FROM … ) = NULL ) THEN

sondern sowas wie
IF ( SELECT true FROM … ) THEN