[linux-l] SQL / PostgreSQL

Olaf Radicke olaf_rad at gmx.de
Do Sep 21 16:08:31 CEST 2006


Am Donnerstag, 21. September 2006 15:22 schrieb Pascal Volk:
> * 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.

Richtig. Das ist genau das was ich will. Eine Id reservieren, die ich selber 
verwende. Ich Kann beim Typ SERIAL der DB überlassen die Funktion für mich zu 
rufen, ich kann aber die ID auch selber setzen. Natürlich nur, wenn ich weiß 
das sie nicht benutzt wurde und werden wird. Genau diese Sicherheit habe ich 
wenn ich nextval() benutze.

> Wo steht bitte geschrieben, dass die Sequenz 'relation_filed_seq' heißen
> muss? Sie kann so heißen, ja.

Ich Guck mir einfach meine Tabellen an und dann weiß ich es. Der name wird 
sich nicht im laufenden Betrieb ändern. Angeblich soll auch 
nextval(tab_name.spalen_name) gehen. Tuts aber nicht bei mir.

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

Genau das ist der Sinn der Übung. 
INSERT INTO firmen_nummer (firmen_nr, firmen_id) VALUES (030-1113324, 13); 

Die "firmen_id" ist in diesem Fall die SERIAL, aber ich weiß welche ID ich 
benutzen kann und vergebe sie selbst.

> Dazu mal wieder ein Beispiel:

[...sql-code...] 


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

Ja, laut meinen Buch ist OID veraltet und von der Benutzung wir abgeraten.

MfG
Olaf




Mehr Informationen über die Mailingliste linux-l