Punktekarte
id (integer),
benoetigte_punkte (integer)
Nutzer_Punktekarte
punktekarte_id (integer) ,
punkte (integer)
2 Fragen:
Durch ein INSERT INTO Nutzer_Punktekarte… wuerde ich gerne den Wert von punkte einfach nur um 1 erhoehen (inkrementieren), allerdings nur bis er die Anzahl der benoetigte_punkte gesammelt hat.
1.Wie kann ich ueberhaupt eine Inkrementierung in sql ausdruecken, also das der aktuelle wert von punkte um 1 erhoeht wird ohne das ich erst per MAX auslese?
2. Und wenndas moeglich ist, kann ich es auch mit der anderen Bedingung (s.o.) vereinen?
test=# create table al_si (id int, benoetigte_punkte int, punkte int default 0); CREATE TABLE
test=*# insert into al_si (id, benoetigte_punkte) values (1,5); INSERT 0 1
test=*# create function f_trigger() returns trigger as $$begin new.punkte = old.punkte+1; if new.punkte > old.benoetigte_punkte then new.punkte=old.benoetigte_punkte; end if; return new;end;$$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 before update on al_si for each row execute procedure f_trigger();
CREATE TRIGGER
test=*# select * from al_si ;
id | benoetigte_punkte | punkte
----+-------------------+--------
1 | 5 | 0
(1 row)
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# select * from al_si ;
id | benoetigte_punkte | punkte
----+-------------------+--------
1 | 5 | 1
(1 row)
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# select * from al_si ;
id | benoetigte_punkte | punkte
----+-------------------+--------
1 | 5 | 4
(1 row)
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# update al_si set punkte = default where id = 1;
UPDATE 1
test=*# select * from al_si ;
id | benoetigte_punkte | punkte
----+-------------------+--------
1 | 5 | 5
(1 row)
test=*#
Das hilft ja schonmal ungemein, vielen Dank für die Mühe
Ich muss es nur noch soweit anpassen, das ich den trigger auf beide tables anpasse (da Sie in Ihrer Lösung alles in einer table hatten). Aber das sollte machbar sein. Ich versuche im Anschluss noch folgendes:Sobald die angestrebten Punkte erreicht wurden soll eine neue Punktekarte erstellt werden und der Punkt dann auf dieser hochgezählt werden. Falls jemanden dazu was einfällt bin ich ganz Ohr! Danke