MySQL Datenbank automatisieren

Oooh ...habe ja schon gesagt das es nicht um alter oder geld geht. Es könnte auch sein das wenn Player1 100 Pkt erreicht er in einer anderen Tabelle einen eintrag in Spalte ' Highscore erreicht' "Ja" und seiner ID.

Dann versuch das Prinzip zu verstehen. TRIGGER lösen bei bestimmten Ereignissen aus. Zum Beispiel, wenn sich ein Record ändert. TRIGGER können Conditions haben - z.B. wenn der Wert einer Spalte unter- oder überschritten wird. Das kann in der Funktion geprüft werden, oder aber u.U. auch schon in der Trigger-Definition.
 
Werbung:
Nur das funktioniert so leider nicht, hätte mich auch stark gewundert.

Fehlermeldungen werfe ich gewöhnlich in Google ein, nur bei 'funktioniert so leider nicht' ist die Trefferqualität äußert beschissen, um es mal so zu formulieren.

Du verwendest MySQL, das ist - etwas anders als man so erwartet. Aber auch, wenn ich gern gegen MySQL meine Sprüche mache: das sollte machbar sein. Selbst mit MySQL.

Btw.: wo kommt 'level' her? Was ist "20"?
 
Code:
CREATE TRIGGER account
      AFTER UPDATE
      ON account
      FOR EACH ROW BEGIN
            IF `alter` = "18" THEN
                  INSERT INTO switcher (ID, Anzahl) VALUES (new.id, 3);

Sorry das mit dem level war jetzt unüberlegt, so passt es zu unserem beispiel.
 
Code:
CREATE TRIGGER account
      AFTER UPDATE
      ON account
      FOR EACH ROW BEGIN
            IF `alter` = "18" THEN
                  INSERT INTO switcher (ID, Anzahl) VALUES (new.id, 3);

Sorry das mit dem level war jetzt unüberlegt, so passt es zu unserem beispiel.


Für den Fall gibt es conditional trigger:

Code:
test=*# create table t1 (id int, alter int);
CREATE TABLE
Time: 0,744 ms
test=*# create or replace function trigger_mache_was() returns trigger as $$begin raise notice 'nu mache ich was'; return new; end; $$language plpgsql;
CREATE FUNCTION
Time: 0,656 ms
test=*# create trigger mein_cooler_trigger after update on t1 for each row when (new.alter >= 18) execute procedure trigger_mache_was() ;
CREATE TRIGGER
Time: 0,509 ms
test=*# insert into t1 values(1, null);
INSERT 0 1
Time: 0,348 ms
test=*# update t1 set alter = 12 where id = 1;
UPDATE 1
Time: 0,291 ms
test=*# update t1 set alter = 20 where id = 1;
NOTICE:  nu mache ich was
UPDATE 1
Time: 0,380 ms

Aber ich glaube zu wissen, daß MyZettelkasten das nicht kann. Du wirst in der Triggerfunktion NEW.<Feld> prüfen müssen.
 
Hey, ich bin weiter vorran gekommen, wenn auch nicht mit deiner Idee.

PHP:
DELIMITER //
CREATE PROCEDURE test1
BEGIN
DECLARE mid INTEGER;
DECLARE ALT INTEGER;
SELECT `Alter` FROM tabelle1 WHERE `Alter` = 18 INTO ALT;
IF (`ALT` >= 18) THEN
SELECT ID FROM tabelle1 WHERE `alter` = 18 INTO mid;
INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (mid,"100");
ELSE SELECT * from tabelle1;
END IF;
END //
DELIMITER ;


Das funktioiert auch gut, sobald das alter einer Person auf 18 gesetzt wird und ich die funktion ausführe. Wird automatisch ein Eintrag in tabelle 2 mit der jeweiligen ID und dem Punktestand 100 erstellt.

Meine letztes Problem ist nun, sobald mehrere Personen 18 sind und ich diese Funktion ausführe kommt eine Fehlermeldung.

Code:
#1172 - Result consisted of more than one row
 
Hey, ich bin weiter vorran gekommen, wenn auch nicht mit deiner Idee.

PHP:
DELIMITER //
CREATE PROCEDURE test1
BEGIN
DECLARE mid INTEGER;
DECLARE ALT INTEGER;
SELECT `Alter` FROM tabelle1 WHERE `Alter` = 18 INTO ALT;
IF (`ALT` >= 18) THEN
SELECT ID FROM tabelle1 WHERE `alter` = 18 INTO mid;
INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (mid,"100");
ELSE SELECT * from tabelle1;
END IF;
END //
DELIMITER ;


Das funktioiert auch gut, sobald das alter einer Person auf 18 gesetzt wird und ich die funktion ausführe. Wird automatisch ein Eintrag in tabelle 2 mit der jeweiligen ID und dem Punktestand 100 erstellt.

Meine letztes Problem ist nun, sobald mehrere Personen 18 sind und ich diese Funktion ausführe kommt eine Fehlermeldung.

Code:
#1172 - Result consisted of more than one row


Ist logisch. Du hast eine Variable ALT, Dein select liefert:

Code:
18
18
18

Deine Lösung funktioniert auch nur dann, wenn Du die Funktion aufrufst (jetzt mal davon abgesehen, daß sie nicht funktioniert), das ist KEINE Lösung wie von Dir gewünscht, da es eben NICHT automatisch geht. Dazu wäre, wie schon gesagt, ein TRIGGER die Lösung.
 
Ja das weiß ich, aber sobald die funktion fertig ist, füge ich sie einfach in einen TRIGGER ein oder nicht ?

PHP:
create trigger mein_cooler_trigger after update on tabelle1 for each row when  execute procedure test1() ;

BTW: Eine lösung für das Problem des Fehlers bei doppelten Einträgen hast du nicht ?:rolleyes:
 
Ja das weiß ich, aber sobald die funktion fertig ist, füge ich sie einfach in einen TRIGGER ein oder nicht ?

PHP:
create trigger mein_cooler_trigger after update on tabelle1 for each row when  execute procedure test1() ;

BTW: Eine lösung für das Problem des Fehlers bei doppelten Einträgen hast du nicht ?:rolleyes:

Du must nicht in der Funktion noch ein Select ausführen, Du kannst auf NEW.* zugreifen. Und ein Per-Row-Trigger feuert separat per Row.
 
Sowohl bei Funktionen als auch bei Triggern muss dir immer klar sein wann wieviele Dinge gleichzeitig passieren können. Liefert ein Select mehr als eine Zeile, kannst du damit keine Variable befüllen. Genauso feuert ein "normaler" Trigger (Gegenstück Per-Row-Trigger wurde ja genannt) immer nur einmal.
 
Leider helfen die letzten antworten einem anfänger echt wenig weiter.
hab den code nochmal überarbeitet und jetzt sieht er so aus
PHP:
BEGIN
DECLARE ALT INTEGER;
SELECT `ID` FROM tabelle1 WHERE `Alter` >= 18 INTO ALT;
INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (ALT,"100");
END

Funktionieren, tut er bei mehreren einträgen natürlich immernoch nicht

Und es kann sein das nur 1 in tabelle1 ist oder auch 10 stk nur soll die tabelle 2 dann halt nur immer auf dem neusten stand gehalten werden. (Hier jetzt noch manuell durch ausführen der Funktion )
 
Leider helfen die letzten antworten einem anfänger echt wenig weiter.

Warum nutzt Du keinen Trigger, der je Row feuert? Ich habs doch schon am Beispiel gezeigt. Ich nutz kein MySQL, daher kann ich es da auch nicht ausformulieren. Aber es gibt doch Doku und so, das ist doch trivial. Du brauchst nur in der Funktion trigger_mache_was() prüfen, ob NEW.alter >= 18 ist und dann in tabelle2 NEW.id und 100 eintragen. Du brauchst in einer Triggerfunktion, für das, was Du da machen willst, kein Select.
 
Werbung:
Habe jetzt eine Lösung gefunden, ich bin vermutlich noch nicht weit genug, euch zu 100 % zu folgen.

Aber falls es euch intressiert die Lösung ist wie folgt, und eig. ganz einfach :

Die Funktion :
PHP:
BEGIN
INSERT  INTO  tabelle2 (`ID`,`Punkte`)SELECT ID,100 FROM tabelle1 WHERE `alter` = 20 AND ID NOT IN (SELECT ID FROM tabelle2) ;
END

Der TRIGGER:

PHP:
create trigger mein_cooler_trigger after update on tabelle1 for each row call test1() ;
 
Zurück
Oben