PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Postgres, OID und fortlaufende Nummerierung


Dr.Doom
2003-01-28, 15:08:23
Howdy,

in Tabellen habe ich mich bisher nicht um die fortlaufende Nummerierung von 'ID'-Spalten (zB 'user_id') gekümmert, da bisher einfach die von Postgres automatisch generierte 'OID' genügte.

Ich habe aber gelesen, dass bei einer Sicherung von Tabellen nicht mehr sichergestelt werden kann, dass eine OID eines Datensatzes in der Originaltabelle, der OID desselben Datensatzes in der Kopie gleichen muss (vgl Code-Absatz: Original - Kopie ).


Original Kopie Echte_Kopie
OID | blubb1 | ... OID | blubb1 | ... OID | blubb1 | ...
------------------ ------------------ ------------------
123 | text1 | 456 | text1 | 123 | text1 |



Es ist aber (natürlich) wichtig, dass eine OID, die in der Originaltabelle zum zB vierten Datensatz gehört, nach einer Sicherung der Tabelle, immer noch denselben Wert hat (vgl Code-Absatz: Original - Echte_Kopie).

1. Ist das Gelesene korrekt? Sind die OIDs nach einer Sicherung von Tabellen nicht mehr dieselben, wie in der Originaltabelle?

2. Falls korrekt: Kann man das irgendwie umgehen?



Falls das eh alles Mumpitz ist, was ich gemacht habe:
Wie kann ich anstelle einer OID, eine eigene 'ID' benutzen, die immer "einen weiteren, nicht bereits vorhandenen" Wert annimmt, wenn man einen Datensatz zur Tabelle hinzufügt, OHNE dass ich mich beim Hinzufügen/Entfernen von Datensätzen um den Wert der jeweiligen ID kümmern muss.


OID | id | blubb1 | blubb2 | ...


Ich möchte beim Hinzufügen in diese Tabelle nur (text1, text2) für die Blubb-Spalten eingeben, aber dennoch soll die 'id' immer einzigartig bleiben.

Puh, tjo, das wars.

Captain America
2003-01-28, 17:13:48
Weiss nich mehr auswendig ob die OID nach reimport noch die selbe ist, glaube ich aber nicht. Laut Dokumentation soll man OIDs nicht für eigene Zwecke verwenden:


http://www.postgresql.org/docs/view.php?version=7.3&idoc=1&file=datatype-oid.html

The oid type is currently implemented as an unsigned four-byte integer. Therefore, it is not large enough to provide database-wide uniqueness in large databases, or even in large individual tables. So, using a user-created table's OID column as a primary key is discouraged. OIDs are best used only for references to system tables.


Eine Möglichkeit mit eigenen IDs ist:


CREAT TABLE tabelle
(
SERIAL id,
VARCHAR(64) text
);


Der Datentyp SERIAL ist eine Combo aus Ganzzahlfeld und Trigger mit Inkrement.

http://www.postgresql.org/docs/view.php?version=7.3&idoc=1&file=datatype.html#DATATYPE-SERIAL

Allerdings kann es sinnvoll sein Sequenzen auch selbst anzulegen, dann weiss man später wo man suchen muss, oder was man im/exportieren will.

Generell würde ich eigene Sequenzen anlegen und mich nicht auf die OID verlassen, so hat man auch ein wenig Protabilität zwischen Datenbanken.

Wenn du die erste Frage ganz genau wissen willst, schaue ich zuhause noch mal im PostgreSQL Buch nach.

Dr.Doom
2003-01-28, 20:39:57
Danke!
Ich habe nun alles von OIDs auf Sequenzen umgebastelt - mal salopp formuliert.

Das Nachsehen im Buch ist nicht mehr nötig, dennoch danke für das Angebot!

Gruss,
drd