From: | Andreas Kretschmer <akretschmer(at)spamfence(dot)net> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Cc: | "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com> |
Subject: | Re: Sequenz mit Ausnahmen |
Date: | 2006-03-07 17:04:54 |
Message-ID: | 20060307170453.GA18825@KanotixBox |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
A. Kretschmer <andreas(dot)kretschmer(at)schollglas(dot)com> schrieb:
> am 07.03.2006, um 16:26:03 +0100 mailte Daniel Seichter folgendes:
> > Hallo,
> >
> > welche Möglichkeiten habe ich, bei einer Sequenz, die von 1 bis
> > "unendlich" laufen soll, einen Wertebereich auszunehmen?!
> >
> > Die Werte 64000 bis 65000 sollen NICHT vergeben werden. Die Sequenz
> > zählt quasi eine Seriennummer hoch, die als Nummer auch in der
> > Fertigung verwendet wird.
>
> Schnellschuß:
schönere Version:
test=# create sequence seq_foo;
CREATE SEQUENCE
test=# create table foo (id int default nextval('seq_foo'));
CREATE TABLE
test=# \i foo_seq.sql
CREATE FUNCTION
test=#
test=# create trigger foo_trigger after insert on foo for each row execute procedure _foo_seq();
CREATE TRIGGER
test=#
test=#
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# select * from foo;
id
----
1
2
3
4
5
11
12
(7 rows)
Die Funktion in 'foo_seq.sql':
create or replace function _foo_seq() returns trigger as $$
begin
if currval('seq_foo') between 5 and 10 then
perform setval('seq_foo', 10);
end if;
return NULL;
end;
$$ language plpgsql;
Das ganze hat allerdings ein Problem:
Der Aufruf von currval() schlägt fehl, wenn in der aktuellen Session
vorher noch kein nextval() kam. Dies müßte noch abgefangen werden, hab
ich aber grad keinen rechten Plan für...
Ich *vermute* mal, man könnte ohne negativen Folgen¹ im Trigger auch
direkt auf das Feld last_value der Sequence zugreifen. Damit wäre das
Problem mit currval() und Session auch gelöst.
¹ im Sinne Transaktionssicherheit und so.
Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknow)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas Kretschmer | 2006-03-07 17:14:15 | Re: Sequenz mit Ausnahmen |
Previous Message | A. Kretschmer | 2006-03-07 16:07:53 | Re: Sequenz mit Ausnahmen |