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