Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: Sequenz mit Ausnahmen



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°



Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group