Hallo,
ich möchte in meiner DB einen TRIGGER erstellen.
Und zwar soll dieser aktiviert werden wenn, in der tabelle "Account" ( enthält: ID (PK), AccName, Level ) das level auf "35" gesetzt wird. Anschließend soll in der Tabelle " Switch " ein neuer eintrage mit ID(Fremdschlüssel von Account), und Anzahl 3 erstellt werden.
Ich habe es mir ungefähr so vorgestellt, nur leider funktioniert meine vorstellung nicht Wäre auch zu schön.
PHP Code:
CREATE TRIGGER switcher_update AFTER UPDATE ON account FOR EACH ROW BEGIN IF `level` = "20" THEN INSERT INTO switcher (ID, Switcher) VALUES (new.id, 3);
Ich bin auch weiter vorran gekommen. Habe eine Funktion erstellt
PHP Code:
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
PS: Nicht wundern Spalten Namen sind anders. && Die ELSE funktion ist vorerst sinnlos.
Das Problem ist das du in die Variable ALT alle Werte hineinschreibst, bei denen der Wert 18 ist. Die Variable kann aber nur einen Wert enthalten, und falls mehrere Spalten diesen Wert aufweisen tritt der Fehler auf.
Du kannst das z.B. mit einem INSERT und einem SELECT als Subquery lösen.
e.G.
Code:
INSERT
INTO tabelle2
(`ID`,`Punkte`)
SELECT ID, "100"
FROM tabelle1
WHERE alter >= 18;
Damit würden alle Spalten mit dem Wert 18 in die tabelle2 geschrieben.
Außerdem hat deine IF Verzweigung keinen Sinn gemacht, denn du holst alle Werte, die bei Alter GENAU 18 haben, und überprüfst dann, ob es welche gibt die größer oder gleich 18 sind
Code:
SELECT `Alter` FROM tabelle1 WHERE `Alter` = 18 INTO ALT;
IF (`ALT` >= 18) THEN
Hm so funktioniert es leider nicht. Nach INSERT INTO muss VALUES folgen und keine abfrage, so kenn ich es zumindest, und so funktioniert es leider auch nur.
Aber du hast recht war vieles sinnfrei der neue code sieht so aus :
PHP Code:
BEGIN DECLARE ALT INTEGER; SELECT `ID` FROM tabelle1 WHERE `Alter` >= 18 INTO ALT; INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (ALT,"100"); END
Das funktioniert auch, nur leider noch nicht mit mehreren einträgen
Super ! Es funktioniert ! :-)
Allerdings noch ein Problem, nun werden zwar auch mehrer Zeilen übertragen, allerdings auch schon übertragene ID's werden auch erneut übertragen beim wiederholen der Funktion.
Lässt sich das vermeiden?
Lässt sich das vermeiden?[/quote]
PHP Code:
BEGIN INSERT INTO tabelle2 (`ID`,`Punkte`)SELECT ID,100 FROM tabelle1 WHERE `alter` = 20; END