Inkrementierung allgemein und bis zu einem bestimmten Wert

Folgende Situation

2 tables:

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?

Ich bin fuer jede Hilfe dankbar.



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=*#

vielleicht so?


Andreas

Das hilft ja schonmal ungemein, vielen Dank für die Mühe :slight_smile:
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

Ach komm: den TRIGGER dahingehend anzupassen ist doch für Dich kein Problem, oder?

Andreas

Danke hat geklappt!