Sequenz mit Ausnahmen

Hallo,

welche Möglichkeiten habe ich, bei einer Sequenz, die von 1 bis "unendlic=
h" 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 verwend=
et wird.

Leider noch postgreSQL 7.4.8, aber bis zur Jahresmitte das Update auf 8.1 g=
eplant.

Grüße und Danke

Daniel Seichter


---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq
Daniel Seichter [ Di, 07 März 2006 16:26 ] [ ID #1218261 ]

Re: Sequenz mit Ausnahmen

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

Keine.

Solche =DCberlegungen sind auch nicht besonders fruchtbar, da eine Sequen=
z auch
ganz locker mal Werte überspringt. Das einzige was eine Sequenz garanti=
ert
sind eindeutige Werte, nicht aber fortlaufende.

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

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend
Peter Eisentraut [ Di, 07 März 2006 17:01 ] [ ID #1218262 ]

Re: Sequenz mit Ausnahmen

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=3D# create table foo (id serial check (id not between 5 and 10));
NOTICE: CREATE TABLE will create implicit sequence "foo_id_seq" for seri=
al column "foo.id"
CREATE TABLE
test=3D#
test=3D#
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
ERROR: new row for relation "foo" violates check constraint "foo_id_chec=
k"
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1

test=3D# select * from foo;
id
----
1
2
3
4
11
12
(6 rows)

Es sollte möglich sein, für den einfachen CHECK-Constraint eine Funkt=
ion
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
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
andreas.kretschmer [ Di, 07 März 2006 17:05 ] [ ID #1218263 ]

Re: Sequenz mit Ausnahmen

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 "un=
endlich"
> > laufen soll, einen Wertebereich auszunehmen?!
>
> Keine.
>
> Solche =DCberlegungen sind auch nicht besonders fruchtbar, da eine Sequ=
enz auch
> ganz locker mal Werte überspringt. Das einzige was eine Sequenz garan=
tiert
> 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
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend
andreas.kretschmer [ Di, 07 März 2006 17:07 ] [ ID #1218264 ]

Re: Sequenz mit Ausnahmen

A. Kretschmer <andreas.kretschmer [at] schollglas.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=3D# create sequence seq_foo;
CREATE SEQUENCE
test=3D# create table foo (id int default nextval('seq_foo'));
CREATE TABLE
test=3D# \i foo_seq.sql
CREATE FUNCTION
test=3D#
test=3D# create trigger foo_trigger after insert on foo for each row exec=
ute procedure _foo_seq();
CREATE TRIGGER
test=3D#
test=3D#
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# insert into foo values (default);
INSERT 0 1
test=3D# 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, ha=
b
ich aber grad keinen rechten Plan für...

Ich *vermute* mal, man könnte ohne negativen Folgen=B9 im Trigger auch
direkt auf das Feld last_value der Sequence zugreifen. Damit wäre das
Problem mit currval() und Session auch gelöst.

=B9 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=B0, E 13.56889=
=B0

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq
Andreas Kretschmer [ Di, 07 März 2006 18:04 ] [ ID #1218265 ]

Re: Sequenz mit Ausnahmen

Andreas Kretschmer <akretschmer [at] spamfence.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=B0, E 13.56889=
=B0

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
Andreas Kretschmer [ Di, 07 März 2006 18:14 ] [ ID #1218266 ]

Re: Sequenz mit Ausnahmen

Andreas Kretschmer <akretschmer [at] spamfence.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=B0, E 13.56889=
=B0

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
Andreas Kretschmer [ Di, 07 März 2006 18:27 ] [ ID #1218267 ]

Re: Sequenz mit Ausnahmen

A. Kretschmer wrote:
> > Solche =DCberlegungen 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 6500=
0
zu setzen. Eine Garantie, dass die Werte 1 bis 64000 verwendet werden,
gibt es sowieso nicht.

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

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match
Peter Eisentraut [ Di, 07 März 2006 21:36 ] [ ID #1218269 ]

Re: Sequenz mit Ausnahmen

am 07.03.2006, um 21:36:48 +0100 mailte Peter Eisentraut folgendes:
> A. Kretschmer wrote:
> > > Solche =DCberlegungen 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 65=
000
> 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
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings
andreas.kretschmer [ Mi, 08 März 2006 06:56 ] [ ID #1219989 ]
Datenbanken » gmane.comp.db.postgresql.german » Sequenz mit Ausnahmen

Vorheriges Thema: durch update in einem trigger einen anderen trigger
Nächstes Thema: Problem mit Foreign Keys (und vererbten Tabellen?)