Nicht ausgeführtes Insert in einer Funktion erhöht Sequences, warum?

Ich habe eine Funktion wie diese:

CREATE OR REPLACE FUNCTION f1(my_name varchar)
  RETURNS integer AS
$BODY$
DECLARE
 my_record record;
BEGIN
 SELECT * INTO my_record FROM t1 where name = my_name;
 IF NOT FOUND THEN
 INSERT INTO t1(
      name)
     VALUES (my_name) RETURNING * INTO my_record;
 END IF;
return my_record.id;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Wenn also kein Eintrag mit dem Namen in der Tabelle vorhanden ist, dann wird einer eingefügt und die ID von der Sequence zurückgegeben. Wenn einer vorhanden ist, dann wird diese ID zurückgegeben.

Leider wird immer beim Aufruf dieser Funktion die Sequence erhöht (auch wenn kein Insert ausgeführt wird), und ich habe deswegen schon einen Wertbereichüberlauf.

Dann hab ich die “vorzeitige Auswertung” der Inserts versucht mit EXECUTES zu unterdrücken:

CREATE OR REPLACE FUNCTION f1(my_name varchar)
  RETURNS integer AS
$BODY$
DECLARE
 my_record record;
BEGIN
 SELECT * INTO my_record FROM t1 where name = my_name;
 IF NOT FOUND THEN
 EXECUTE 'INSERT INTO t1(
      name)
     VALUES (' || quote_literal(my_name) || ') RETURNING *' INTO my_record;
 END IF;
return my_record.id;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Hat auch nicht funktioniert. Ich bin echt sprachlos, da ich damit nicht gerechnet habe.

Hat jemand eine Idee wie ich das in den Griff bekommen kann?

Das bezweifle ich. Also, daß die Sequence auch durch das SELECT erhöht wird Wie ist denn die Tabelle definiert?

Ansonsten:
Sequencen sind, mal vereinfacht dargestellt, nicht rückrollfähig. Also, wenn einmal mittels nextval() eine Nummer gezogen wurde, dann wird diese auch nicht durch ein Rollback wieder verringert, sondern bleibt so. Das ist so gewollt und dokumentiert. Und das diese überläuft, verhindert bigserial, denn das geht bis 9223372036854775807. Ich bezweifle, daß Dir das schon mal zu eng wurde…

Andreas

Nunja - bigserial kann aber nicht verhindern, dass das Ziel-Feld überläuft - wenn man dieses als ein normales integer feld definiert ist (und kein bigint), wird dieses feld üerlaufen, wenn man zu grosse zahlen schreibt - oder (was ich hoffe) ein fehler provoziert.