Seite 1 von 1

generated pk skipping existing

Verfasst: Mi 19. Okt 2016, 15:22
von PatrickR
Hallo,
nach langem suchen habe ich leider keinen Eintrag zu dem Thema hier im Forum oder bei Google gefunden.
PKs mit einer Sequenz generieren zu lassen funktioniert ja sehr leicht, aber gibt es eine einfache Möglichkeit nach der Generierung zu prüfen ob dieser Verfügbar ist?

Beispiel:

Einträge existieren in der Tabelle mit PKs von 300-400. Die Sequenz startet bei 1 und inkrementiert um 1. Bei PK 299 sollte der nächste nicht 300 sein sondern 401.

Erreiche ich das nur duch Trigger und function/procedure oder extra Key Tabelle?

Danke für eure Hilfe!
Grüße Patrick

Re: generated pk skipping existing

Verfasst: Mi 19. Okt 2016, 15:27
von akretschmer
wäre das Setzen der Sequenze auf den höchsten Wert + 1 nicht auch eine Option?

Re: generated pk skipping existing

Verfasst: Mi 19. Okt 2016, 23:30
von PatrickR
ja, wäre eine Option und denke ich auch die einfachste. Ich hätte nur gerne das die PKs von der DB generiert werden ohne das ich selber Hand anlegen muss.
Ich bekomme Daten aus einer Excel Tabelle mit Pks die nicht verändert werden dürfen. Die Daten möchte ich zur Laufzeit einfügen ohne die sequenz anfassen zu müssen.

Re: generated pk skipping existing

Verfasst: Do 20. Okt 2016, 07:38
von Gisman
Dann dürfe das einmalige Setzen des Startwerts die beste Möglichkeit sein.

Gruß Uwe

Re: generated pk skipping existing

Verfasst: Do 20. Okt 2016, 10:45
von PatrickR
Ja, das Problem das ich dabei habe ist nur das die Sequenz mir dann keine unique PKs erzeugt.

meine Sequenz:

Code: Alles auswählen

create sequence primary_key_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
meine Tabelle:

Code: Alles auswählen

create table article (
  artID serial PRIMARY KEY,
  artName varchar
);
Wenn ich Einträge mit

Code: Alles auswählen

insert into article(arID, artName) values (nextval('primary_key_seq'), 'Schuhe');
einfüge funktioniert das ganze ja ohne Probleme.
Ich möchte unabhängig von der Sequenz Einträge wie

Code: Alles auswählen

insert into article(arID, artName) values (300, 'Stiefel');
einfügen. Die Sequenz soll dann z.B. 300 überspringen und nach 299, 301 ausgeben.

Gibt es eine Möglichkeit das PostgreSql das automatisch kann oder muss ich das selber implementieren?

Re: generated pk skipping existing

Verfasst: Do 20. Okt 2016, 11:11
von castorp
PatrickR hat geschrieben:dann z.B. 300 überspringen und nach 299, 301 ausgeben.

Gibt es eine Möglichkeit das PostgreSql das automatisch kann oder muss ich das selber implementieren?
Das geht nur über einen Trigger der prüft ob ein Wert angegeben wurde, und dann ein entsprechendes setval() aufruft.

Alternativ, nach dem Importieren des Excel-Sheets einmal setval() aufrufen. Das setzt aber voraus, dass während dem Importieren keine anderen INSERTs gemacht werden.

Re: generated pk skipping existing

Verfasst: Fr 21. Okt 2016, 08:25
von frastr
Ich verstehe den Sinn noch nicht, warum die Sequence fortlaufend, im Sinne von ohne Lücken sein muss. Das scheint ja dein Hauptanliegen zu sein, oder?
Man könnte ja auch definieren, das arID, wenn durch PG vergeben negativ ist. Alles was über Excel eingefügt wird dann positiv, weil es so in der Excel steht.
Damit sollte es keine Überschneidungen mehr geben.

Code: Alles auswählen

create sequence seq_test start with -1 increment by -1;

Re: generated pk skipping existing

Verfasst: Fr 21. Okt 2016, 17:24
von PatrickR
Wäre natürlich auch eine Möglichkeit, ist aber für die Ausgabe doof. (muss im Programm dann wieder *-1 gerechnet werden)
Lücken sind egal, es geht um Einträge die "von Hand" eingefügt worden sind und diese sollen übersrpungen werden. Das System läuft einen Tag und wird danach wieder auf Ursprung zurück gesetzt. Trotzdem möchte ich nicht von Hand die Pflege der PKs übernehmen.