generated pk skipping existing

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
PatrickR
Neuer Benutzer
Beiträge: 4
Registriert: Mi 19. Okt 2016, 13:48
Wohnort: Germany
Kontaktdaten:

generated pk skipping existing

Beitrag von PatrickR » Mi 19. Okt 2016, 15:22

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

akretschmer
Erfahrener Benutzer
Beiträge: 7458
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: generated pk skipping existing

Beitrag von akretschmer » Mi 19. Okt 2016, 15:27

wäre das Setzen der Sequenze auf den höchsten Wert + 1 nicht auch eine Option?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

PatrickR
Neuer Benutzer
Beiträge: 4
Registriert: Mi 19. Okt 2016, 13:48
Wohnort: Germany
Kontaktdaten:

Re: generated pk skipping existing

Beitrag von PatrickR » Mi 19. Okt 2016, 23:30

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.

Gisman
Erfahrener Benutzer
Beiträge: 1094
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: generated pk skipping existing

Beitrag von Gisman » Do 20. Okt 2016, 07:38

Dann dürfe das einmalige Setzen des Startwerts die beste Möglichkeit sein.

Gruß Uwe

PatrickR
Neuer Benutzer
Beiträge: 4
Registriert: Mi 19. Okt 2016, 13:48
Wohnort: Germany
Kontaktdaten:

Re: generated pk skipping existing

Beitrag von PatrickR » Do 20. Okt 2016, 10:45

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?

castorp
Erfahrener Benutzer
Beiträge: 1038
Registriert: Sa 27. Jun 2009, 22:24

Re: generated pk skipping existing

Beitrag von castorp » Do 20. Okt 2016, 11:11

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.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

frastr
Benutzer
Beiträge: 38
Registriert: Di 9. Sep 2014, 12:20
Wohnort: Hoyerswerda, Sachsen

Re: generated pk skipping existing

Beitrag von frastr » Fr 21. Okt 2016, 08:25

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;

PatrickR
Neuer Benutzer
Beiträge: 4
Registriert: Mi 19. Okt 2016, 13:48
Wohnort: Germany
Kontaktdaten:

Re: generated pk skipping existing

Beitrag von PatrickR » Fr 21. Okt 2016, 17:24

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.

Antworten