[linux-l] SQL / PostgreSQL

Pascal Volk linux-l at edelhost.de
Do Sep 21 15:22:45 CEST 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

* Am Mi, 20 Sep 2006 schrub Olaf Radicke:
> Lösung gefunden:
> [...]
> Wenn ich also meine ID haben will, muss ich den weg "zu Fuss" machen. Erster 
> Schritt:
> SELECT nextval('einschraenkung_merkmal_id_seq');
> Dazu muss ich natürlich den Sequenz Namen kennen. Der setzt sich zusammen aus 
> Tabellenname, Tiefstrich, Spaltenname, Tiefstrich, "seq".

Nein und nein.
Was macht denn nextval? Etwa den nächsten (erst setzen) und dann
zurückgeben? Ja - genau.
Rufe dazu mehr SELECT nextval('einschraenkung_merkmal_id_seq'); auf, und du
wirst sehen, dass jedesmal ein anderen Wert rauskommt. Aber Du wirst niemals
einen Datensatz haben, der die ID hat, die Dir mit nextval angezeigt wurde.

Wo steht bitte geschrieben, dass die Sequenz 'relation_filed_seq' heißen
muss? Sie kann so heißen, ja.
 
> Jetzt habe ich meine eindeutige ID, die mir niemand mehr wegnehmen kann. Egal 
> welche Operationen auf der Tabelle in der zwischenzeit ausgeführt werden, 
> wann immer ein Anderer direkt nextval() oder indirekt SERIAL aufruft, er wird 
> immer eine andere ID bekommen, als ich. Auch wenn ich mir 10 Jahre Zeit lasse 
> zwischen dem nextval()-Aufruf und dem INSERT-Befehl. Meine ID wird für mich 
> frei sein.

Ha, das hast Du Dir schön gedacht.
Du nimmst Dir, mit der oben beschrieben Variante, die ID selbst weg, aka
Trick 17 m. S. Kein Datensatz wird diese ID jemals bekommen.

Dazu mal wieder ein Beispiel:
template1=# CREATE DATABASE foobar WITH ENCODING='UNICODE';
CREATE DATABASE
template1=# \c foobar 
Sie sind jetzt mit der Datenbank »foobar« verbunden.
foobar=# CREATE SEQUENCE bar
foobar-#     MINVALUE 15000
foobar-#     START    15000
foobar-#     INCREMENT BY 7
foobar-#     NO CYCLE;
CREATE SEQUENCE
foobar=#     
foobar=# CREATE TABLE foo(
foobar(#     bar bigint DEFAULT nextval('bar') NOT NULL PRIMARY KEY,
foobar(#     baz varchar(50) NOT NULL
foobar(# ) WITH OIDS;
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
CREATE TABLE
foobar=# INSERT INTO foo (baz) VALUES ('Lecker Kaffe');
INSERT 23768 1
foobar=# SELECT * FROM foo;
  bar  |     baz      
- -------+--------------
 15000 | Lecker Kaffe
(1 Zeile)

foobar=# SELECT nextval('bar');
 nextval 
- ---------
   15007
(1 Zeile)

foobar=# SELECT nextval('bar');
 nextval 
- ---------
   15014
(1 Zeile)

foobar=# INSERT INTO foo (baz) VALUES ('Lecker Kaffe');
INSERT 23769 1
foobar=# SELECT * FROM foo;
  bar  |     baz      
- -------+--------------
 15000 | Lecker Kaffe
 15021 | Lecker Kaffe
(2 Zeilen)

foobar=#

Meine Mail vom 19/09/06 hast Du gelesen?


Gruß
Pascal
- -- 
rm -Rfv /tmp/../ && echo "are you sure???"

Die BeLUG im IRC:
irc://irc.freenode.net/#belug
 ____ ____ ____ ____ ____ _________ ____ ____ ____ ____ ____ ____ 
 ||/ |||j |||o |||i |||n |||       |||# |||b |||e |||l |||u |||g ||
 ||__|||__|||__|||__|||__|||_______|||__|||__|||__|||__|||__|||__||
 |/__\|/__\|/__\|/__\|/__\|/_______\|/__\|/__\|/__\|/__\|/__\|/__\|

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFFEpIlNx2k6gsBqqkRAnJKAJsEk+Xp8/JG5QeEiS/T89dxKH8vtQCfQRRS
Ss25z6PVO3TzmjYW3zXZZz0=
=kY//
-----END PGP SIGNATURE-----



Mehr Informationen über die Mailingliste linux-l