Datentyp serial

Hi Leute,
ich habe folgende Tabelle erstellt:

CREATE TABLE "public"."per" (
  "id" UUID NOT NULL, 
 [B] "perno" INTEGER DEFAULT nextval('per_perno_seq2'::regclass) NOT NULL, [/B]
  "adrno" INTEGER NOT NULL, 
  "anrede" INTEGER DEFAULT 1 NOT NULL,  
..... 
CONSTRAINT "per_pkey" PRIMARY KEY("perno")
) WITHOUT OIDS;

CREATE SEQUENCE "public"."per_perno_seq"
  INCREMENT 1 MINVALUE 1
  MAXVALUE 9223372036854775807 START 1
  CACHE 1;

Ich habe die Tabelle mit “COPY” gefüllt und möchte nun neue Sätze (mit ADODB.BatchUpdate) einfügen.
Die Spalte “perno” wird jedoch beginnend mit 1 gefüllt, obwohl bereits Werte vorhanden sind bzw. es kommt ein Fehler:

doppelter Schlüsselwert verletzt Unique-Constraint >per_pkey<.

Was muss ich machen, damit es funktioniert?
Besten Dank.

Die Sequence auf einen passenden Startwert setzen. setval() ist Dein Freund, PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Sequence Manipulation Functions

Andreas

Danke Andreas,
so funktioniert es.
(Ich mach’s halt so:

ALTER SEQUENCE public.per_perno_seq RESTART WITH 15798;

  • sofort nach der Dateneingabe, im gleichen Script).
    Nächste Frage:
    Wie bekomme ich die nächste Nummer aus der Datenbank

SELECT ??? nextval(‘per_perno_seq’) ???

  • oder so ähnlich.
    Den Aufruf muss ich aus dem Programm heraus über ODBC machen und nicht in der Eingabeaufforderung.

Geht das ganze nicht einfacher?
Früher (mit Jet/Access-DB) habe ich eine eigene Tabelle für Serial/AutoWert-Daten gemacht und selber die Nummer geholt, erhöht und upgedatet, alles unter Transactionskontrolle und “adLockPessimistic”-Sperre - das ging ohne Probleme und damit hatte ich alles unter Kontrolle. Ich denke, ich werd’s wieder so machen!

Besten Dank.

Ja, nextval() ist okay. Oder Du läßt beim INSERT die Spalte weg (nicht mit aufzählen, keinen Wert angeben) oder aber setzt DEFAULT als Wert. Was ODBC noch dazwischen rumpfuscht weiß ich aber nicht.

Andreas

Danke Andreas.
Ich werd’s doch wie früher machen, da weis ich wie es funkt und dass es funkt.
Die nextval()-Funktion scheint eine “psql”-Funktion zu sein, ich würde aber eine SQL-Funktion benötigen, um den neuen Wert zu erhalten.
Eine Spalte nicht aufzählen geht auch nicht, da ich einen kompletten (leeren) Satz zuerst aus der DB hole und dann diesen Satz fülle und mit “updatebatch” in die DB schreibe, alles über ODBC und SQL.
Zusätzlich benötige ich noch vor dem Schreiben die neue Nummer um eine “ListView” updaten zu können, denn es würde den Benutzer verwirren, wenn er einen neuen Satz mit einer “0” angezeigt bekommt und erst beim wiederholten Lesen des Satzes die richtige neue Nummer angezeigt bekommt.

Nun ja, man kann natürlich das Rad neu erfinden …

nextval() ist im übrigen keine ‘psql’-Funktion, sondern durchaus eine SQL-Funktion.

Andreas

Andreas