Wie bekomme ich den seq-Schlüssel wieder aktuell

Hallo,
habe folgendes Problem und komme einfach nicht weiter.

Habe aus einer Tabelle die Daten exportiert, und diese in eine andere Tabelle importiert.

Beide Tabellen haben die gleiche Struktur, von daher gibt es damit keine Probleme.

Mein jetziges Problem ist jedoch, dass ich in der neuen Tabelle keinen Daten einfügen kann.

Problem ist auch bekannt, da der Sequence Key der neuen Tabelle auf 1 steht da er ja nicht mitbekommen hat, dass in die Tabelle Daten eingefügt worden sind.

Wie kann ich das gerade biegen oder noch besser wie vermeide ich diesen Fehler grundsätzlich ?

Du kannst nun die Sequence manipulieren, siehe PostgreSQL: Documentation: Manuals: Sequence Manipulation Functions.

Zukünfig bei sowas für diese Spalte DEFAULT einsetzen, oder weglassen (in der Spalten-Aufzählung beim INSERT).

Andreas

Ok da habe ich doch wahrscheinlich noch das Wichtigste vergessen, sorry !
Die Daten wurden in ein Excel File exportiert, das ich auch wieder importiere.
Ich kann die Spalte nicht weglassen, das sie in einer anderen Tabelle als n-n Beziehung gespeichert sind, also auch DEFAULT nicht möglich.

Ja, also dann bleibt also nur der Weg, die Spalte mit zu übernehmen und dann die Sequence zu setzen, wo war jetzt Dein Problem?

Andreas

Das Problem ist
SELECT setval(‘sequence’, SELECT höchste Zahl in der Tabellenspalte );
Ich kann keinen count machen, da dort schon Datensätze gelöscht wurden, die letzte Nummer also höher ist als die Anzahl der Datensätze.
Wie bekomme ich den Select der Tabelle in den setval ?
Steh da gerade auf dem Schlauch !

max() ist eine Funktion, die bereits erfunden wurde :wink:

Andreas

AU Backe ! Voll auf die 12 !

Bekomme ich das ganze auch in einen Befehl ?

SELECT setval(‘sequence’, SELECT max(id) from table)

Bist nah dran…

test=# create table gdietrich (s serial);
NOTICE:  CREATE TABLE will create implicit sequence "gdietrich_s_seq" for serial column "gdietrich.s"
CREATE TABLE
Time: 2,156 ms
test=*# insert into gdietrich select * from generate_series(1,1000)s;
INSERT 0 1000
Time: 1,976 ms
test=*# select setval('gdietrich_s_seq',(select max(s) from gdietrich));
 setval
--------
   1000
(1 row)

Time: 0,663 ms
test=*# insert into gdietrich (s) values (default) returning s;
  s
------
 1001
(1 row)

INSERT 0 1
Time: 0,274 ms

Andreas

Danke !
Knapp daneben ist auch vorbei !

Ich weiss das gehört jetzt nicht hierher, aber eine kurze Frage hätte ich noch:
Hab das Problem das ich ein Feld anlegen muss in dem die Produktionsdauer gespeichert wird.
Hatte ich zuerst auf TIME gesetzt, kein Problem.
Nun ist der Fall aufgetaucht, dass die Dauer über einen Tag geht, damit ist ja TIME aussen vor !
Gibt es eine andere Möglichkeit ausser meiner jetzigen ( textfeld ##:## ) ?
Mit diesem habe ich natürlich Probleme beim Rechnen.

Entweder Du nimmst den Datentyp INTERVAL, wenn es wirklich nur um die Dauer geht, oder, aber das ist noch sehr neu (und extrem cool) PERIOD, guggst Du Temporal Postgres - Reference

Mit PERIOD kannst dann z.B. auch prüfen, ob sich die Zeiten nahtlos anschließen oder überlappen (oder aber Du verhinderst mit einem Constraint, daß sie sich überlappen dürfen) und so weiter, sehr cooles Feature …


Andreas

Das hört sich extrem gut an !
Kann ich super für ne Produktionsplanung einsetzen !

Noch als Hinweis: das ist noch nicht im offiziellem PG drin - wird aber wohl mit 9.2 kommen.
select * from depesz; » Blog Archive » Waiting for 9.2 – Range data types

Bis dahin: selber compilieren …


Andreas

Muss ich mir mal anschauen, seither hab ich nur Linux - Kernel selbst gestrickt und kompiliert, noch nie ne Datenbank !