Re: Sequenz mit Ausnahmen

Lists: pgsql-de-allgemein
From: "Daniel Seichter" <dseichter(at)radiomatic(dot)com>
To: <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Sequenz mit Ausnahmen
Date: 2006-03-07 15:26:03
Message-ID: s40db43c.009@HBC-N4.hbccr.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

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.

Leider noch postgreSQL 7.4.8, aber bis zur Jahresmitte das Update auf 8.1 geplant.

Grüße und Danke

Daniel Seichter


From: Peter Eisentraut <peter_e(at)gmx(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Cc: "Daniel Seichter" <dseichter(at)radiomatic(dot)com>
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 16:01:22
Message-ID: 200603071701.23053.peter_e@gmx.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Am Dienstag, 7. März 2006 16:26 schrieb Daniel Seichter:
> welche Möglichkeiten habe ich, bei einer Sequenz, die von 1 bis "unendlich"
> laufen soll, einen Wertebereich auszunehmen?!

Keine.

Solche Überlegungen sind auch nicht besonders fruchtbar, da eine Sequenz auch
ganz locker mal Werte überspringt. Das einzige was eine Sequenz garantiert
sind eindeutige Werte, nicht aber fortlaufende.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/


From: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 16:05:15
Message-ID: 20060307160515.GA5469@webserv.wug-glas.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

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ß:

test=# create table foo (id serial check (id not between 5 and 10));
NOTICE: CREATE TABLE will create implicit sequence "foo_id_seq" for serial column "foo.id"
CREATE TABLE
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);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
test=# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
test=# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
test=# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
test=# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
test=# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_check"
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
11
12
(6 rows)

Es sollte möglich sein, für den einfachen CHECK-Constraint eine Funktion
zu basteln, die mit currval() prüft, wenn die untere Grenze erreicht
ist, und dann mit setval() den Sprung macht.

>
> Leider noch postgreSQL 7.4.8, aber bis zur Jahresmitte das Update auf
> 8.1 geplant.

Was ist, wenn bis dahin 8.2 da ist? ;-)

Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47215, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=== Schollglas Unternehmensgruppe ===


From: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 16:07:53
Message-ID: 20060307160753.GB5469@webserv.wug-glas.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

am 07.03.2006, um 17:01:22 +0100 mailte Peter Eisentraut folgendes:
> Am Dienstag, 7. März 2006 16:26 schrieb Daniel Seichter:
> > welche Möglichkeiten habe ich, bei einer Sequenz, die von 1 bis "unendlich"
> > laufen soll, einen Wertebereich auszunehmen?!
>
> Keine.
>
> Solche Überlegungen sind auch nicht besonders fruchtbar, da eine Sequenz auch
> ganz locker mal Werte überspringt. Das einzige was eine Sequenz garantiert
> sind eindeutige Werte, nicht aber fortlaufende.

Naja, das hat er so aber auch nicht erwartet.

Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47215, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=== Schollglas Unternehmensgruppe ===


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
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: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 17:14:15
Message-ID: 20060307171415.GB18825@KanotixBox
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Andreas Kretschmer <akretschmer(at)spamfence(dot)net> schrieb:
> 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 seh grad, daß es, da after trigger ist, kein Problem gibt. ;-)

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: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 17:27:33
Message-ID: 20060307172733.GC18825@KanotixBox
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Andreas Kretschmer <akretschmer(at)spamfence(dot)net> schrieb:
> 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;

Nachtrag:

$$-Quoting geht erst ab 8.x, das mußt Du also anpassen. Ich hab grad
keine alte Version zur Hand, das zu probieren...

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: Peter Eisentraut <peter_e(at)gmx(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 20:36:48
Message-ID: 200603072136.48801.peter_e@gmx.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

A. Kretschmer wrote:
> > Solche Überlegungen sind auch nicht besonders fruchtbar, da eine
> > Sequenz auch ganz locker mal Werte überspringt. Das einzige was
> > eine Sequenz garantiert sind eindeutige Werte, nicht aber
> > fortlaufende.
>
> Naja, das hat er so aber auch nicht erwartet.

In dem Fall wäre es wohl das einfachste, den Start der Sequenz auf 65000
zu setzen. Eine Garantie, dass die Werte 1 bis 64000 verwendet werden,
gibt es sowieso nicht.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/


From: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-08 05:56:43
Message-ID: 20060308055642.GA17505@webserv.wug-glas.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

am 07.03.2006, um 21:36:48 +0100 mailte Peter Eisentraut folgendes:
> A. Kretschmer wrote:
> > > Solche Überlegungen sind auch nicht besonders fruchtbar, da eine
> > > Sequenz auch ganz locker mal Werte überspringt. Das einzige was
> > > eine Sequenz garantiert sind eindeutige Werte, nicht aber
> > > fortlaufende.
> >
> > Naja, das hat er so aber auch nicht erwartet.
>
> In dem Fall wäre es wohl das einfachste, den Start der Sequenz auf 65000
> zu setzen. Eine Garantie, dass die Werte 1 bis 64000 verwendet werden,
> gibt es sowieso nicht.

Auch wahr.

Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47215, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=== Schollglas Unternehmensgruppe ===