Trigger in MySQL

NBOne

Mitglied
Hi,

ich bin noch nicht wirklich mit den Triggern von MySQL vertraut und bis jetzt die MSSQL Syntax gewöhnt. Jetzt habe ich folgende Frage:

Ich möchte ganz einfach beim Insert in eine Tabelle einen Trigger abfeuern der mir ein Feld derselben Tabelle auf den Wert einer Funktion setzt. Dazu habe ich folgenden Code:

CREATE TRIGGER trg_shop_item_before_insert BEFORE INSERT ON shop_item
FOR EACH ROW BEGIN
SELECT NEW.shopitem_nr = func_return_code();
END

Das dumme ist nur, das ich damit einen Syntax error bekomme. Kann mir jeamnd sagen wieso...

Danke für eure Hilfe...
 
Ich habe eine Funktion func_return_code(), und der Rückgabewert von dieser soll beim einfügen einer neuen Tabellenzeile in ein Feld der Tabelle eingefügt werden.

Kannst du mir sagen was an meinem Trigger falsch ist?Ich komm mit der Fehlermeldung einfach nicht klar.

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 '' at line 3

In meinem Query sind doch nirgentswo '
 
Zuletzt bearbeitet:
Hi,

hast Du Dir meinen Link mal angeschaut?
Also erstmal müsste das ja SET NEW.shopitem_nr = ... heißen, oder nicht? Was soll denn das SELECT bewirken?
Dann frage ich mich, was das heißt, dass Du eine Funktion func_return_code() hast. Wo kommt die her? Ich glaube, MySQL kennt die nicht. Und deshalb habe ich gefragt, was der Trigger genau bewirken soll, weil:

Ich habe eine Funktion func_return_code(), und der Rückgabewert von dieser soll beim einfügen einer neuen Tabellenzeile in ein Feld der Tabelle eingefügt werden.

so viel hatte ich schon verstanden. ;)

LG
 
Hi,

also fie Funktion hab ich vorher mit create function blabla angelegt.

Mit dem SELECT hast du natürlich recht, bei MSSQL Funktionieren SET und SELECT für variablen gleich, deswegen hab ich das instinktiv so gemacht.

Ansonsten funktionierts jetzt mit:

CREATE TRIGGER trg_shop_item_before_insert BEFORE INSERT ON shop_item
FOR EACH ROW SET NEW.shopitem_nr = func_get_standard_code('I', 'shop_item');

und

CREATE TRIGGER trg_shop_item_before_insert BEFORE INSERT ON shop_item
FOR EACH ROW BEGIN
SET NEW.shopitem_nr = func_get_standard_code('I', 'shop_item');
END

Funktioniert nicht...und da mir im Moment ein einzeliger trigger reicht is mir das jetzt einfach mal egal.


Danke für deine Hilfe!
 
hallo,

ich habe auch eine wichtige frage!

vielen dank für ideen im voraus...

in der mssql syntax brauchte man am ende einfach select * from deleted angeben...

wie ist das in mysql? muss ich immer (bla) value (old.bla) angeben?

also damit ausdrücklich nur die gelöschte zeile in die deleted übertragen wird
 
du wirst es wahrscheinlich nicht mehr brauchen, aber der vollständigkeit halber..

CREATE TRIGGER trg_shop_item_before_insert BEFORE INSERT ON shop_item
FOR EACH ROW BEGIN
SET NEW.shopitem_nr = func_get_standard_code('I', 'shop_item');
END

funktioniert nicht, weil das semikolon am ende der vorletzten zeile das trennsymbol (engl = delimiter) ist. damit hast du ein BEGIN aber kein END, weil er soweit nicht kommt. änder das trennsymbol einfach vorher und nachher:

Code:
DELIMITER //
CREATE TRIGGER trg_shop_item_before_insert BEFORE INSERT ON shop_item
FOR EACH ROW BEGIN
SET NEW.shopitem_nr = func_get_standard_code('I', 'shop_item');
END
DELIMITER ;



wie ist das in mysql? muss ich immer (bla) value (old.bla) angeben?

bei einem trigger der vor oder nach einem delete aufgerufen wird (BEFORE DELETE bzw. AFTER DELETE), kannst du mit old.spaltenname auf den alten wert, d.h. den wert aus der zeile der gelöscht werden soll, zugreifen. ein select brauchst du dafür nicht.
 

Neue Beiträge

Zurück