Fehlermeldung bei Triggererstellung

LordTerra

Neuer Benutzer
Beiträge
3
DROP TRIGGER IF EXISTS `InsUser`

DELIMITER $$

CREATE TRIGGER InsUser BEFORE INSERT ON user
FOR EACH ROW
BEGIN

DECLARE isFound INT DEFAULT 0;

SELECT count(*) INTO isFound FROM user WHERE name = NEW.name;

IF isFound == 0 THEN
INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) VALUES ( NEW.name, NEW.mc_id, CURDATE(), CURTIME());
ELSE
UPDATE user SET lastlogin_date = CURDATE(), lastlogin_time = CURTIME() WHERE name = NEW.name;
ENDIF;

END;
$$

DELIMITER ;

Meldung:

#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 '== 0 THEN INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) V' at line 9

warum ist das so ?

mfg LT
 
Werbung:

Margit

Fleissiger Benutzer
Teammitglied
Beiträge
56
Ist isFound eine Funktion?

Ich würds spontan erst mal so versuchen (habs aber nicht ausprobiert):

Code:
FOR EACH ROW BEGIN
IF EXISTS (SELECT x FROM tabelle WHERE ) THEN......
 

LordTerra

Neuer Benutzer
Beiträge
3
ok 2 fehler gefunden : (zu c++ lastig sorry)

1. == ist falsch darf nur =
2. irgendwie (warum auch immer) geht die IF nicht
hab das jetzt wie folgt:

DROP TRIGGER IF EXISTS `InsUser`

DELIMITER $$

CREATE TRIGGER InsUser BEFORE INSERT ON user
FOR EACH ROW
BEGIN

DECLARE isFound INT DEFAULT 0;

SELECT count(*) INTO isFound FROM user WHERE name = NEW.name;

CASE WHEN isFound = 0 THEN
INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) VALUES ( NEW.name, NEW.mc_id, CURDATE(), CURTIME());
ELSE
UPDATE user SET lastlogin_date = CURDATE(), lastlogin_time = CURTIME() WHERE name = NEW.name;
END CASE;

END$$

DELIMITER ;

problem hierbei: ich bekomm beim insert folgende fehlermeldung:
#1442 - Can't update table 'user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

meine vermutung ist ja: ich will ein insert auf die Tabelle machen und weil in meinem trigger auch ein insert steht stört das irgendwie ...
nur wie bekomm ich das hin ?

mein versuch war es: eine tabelle mit 4 spalten, wenn ich 2 fülle sollen die beiden anderen automatisch mit gefüllt werden
hier soll aber vorher unterschieden werden ob ein insert oder ein update , wenn werte schon vorhanden, gemacht wird...
 

akretschmer

Datenbank-Guru
Beiträge
9.830
problem hierbei: ich bekomm beim insert folgende fehlermeldung:
#1442 - Can't update table 'user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

meine vermutung ist ja: ich will ein insert auf die Tabelle machen und weil in meinem trigger auch ein insert steht stört das irgendwie ...
nur wie bekomm ich das hin ?

Kein Insert machen, stattdessen ein return NEW. Dann macht der Trigger normal weiter. Also, jetzt nicht getestet, aber so geht's in PostgreSQL.
 

LordTerra

Neuer Benutzer
Beiträge
3
frage: kann ich einen "insert" befehl schicken und mittels trigger in ein Update Befehl umwandeln ?

heisst ich schick

insert into user ...

<- trigger schlägt zu guckt nach ah hier is schon ein eintrag mit den daten
<- trigger macht aus insert ein update

^^ geht das?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.830
frage: kann ich einen "insert" befehl schicken und mittels trigger in ein Update Befehl umwandeln ?

heisst ich schick

insert into user ...

<- trigger schlägt zu guckt nach ah hier is schon ein eintrag mit den daten
<- trigger macht aus insert ein update

^^ geht das?

Ja:

Code:
test=# create table lordterra (i int);
CREATE TABLE
test=*# insert into lordterra values(0);
INSERT 0 1
test=*# create function f1() returns trigger as $$begin update lordterra set i=new.i; return null; end;$$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 before insert on lordterra for each row execute procedure f1();
CREATE TRIGGER
test=*# select * from lordterra ;
 i
---
 0
(1 row)

test=*# insert into lordterra values (1);
INSERT 0 0
test=*# select * from lordterra ;
 i
---
 1
(1 row)

test=*# insert into lordterra values (99);
INSERT 0 0
test=*# select * from lordterra ;
 i
----
 99
(1 row)
 
Oben