# generated pk skipping existing

**URL:** https://www.pg-forum.de/t/generated-pk-skipping-existing/9128
**Category:** Trigger und Funktionen
**Created:** [19. Oktober 2016 um 13:22 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128 "2016-10-19T13:22:33Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![PatrickR](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/2acd7d/32.png) [@PatrickR](https://www.pg-forum.de/u/PatrickR)
#### Post date: [19. Oktober 2016 um 13:22 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/1 "2016-10-19T13:22:33Z")

</div>

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

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [19. Oktober 2016 um 13:27 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/2 "2016-10-19T13:27:15Z")

</div>

wäre das Setzen der Sequenze auf den höchsten Wert + 1 nicht auch eine Option?

---

<div class="post-metadata">

### Author: ![PatrickR](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/2acd7d/32.png) [@PatrickR](https://www.pg-forum.de/u/PatrickR)
#### Post date: [19. Oktober 2016 um 21:30 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/3 "2016-10-19T21:30:56Z")

</div>

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.

---

<div class="post-metadata">

### Author: ![Gisman](https://www.pg-forum.de/user_avatar/www.pg-forum.de/gisman/32/252_2.png) [@Gisman](https://www.pg-forum.de/u/Gisman)
#### Post date: [20. Oktober 2016 um 05:38 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/4 "2016-10-20T05:38:07Z")

</div>

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

Gruß Uwe

---

<div class="post-metadata">

### Author: ![PatrickR](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/2acd7d/32.png) [@PatrickR](https://www.pg-forum.de/u/PatrickR)
#### Post date: [20. Oktober 2016 um 08:45 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/5 "2016-10-20T08:45:17Z")

</div>

Ja, das Problem das ich dabei habe ist nur das die Sequenz mir dann keine unique PKs erzeugt.

meine Sequenz:

```nohighlight
create sequence primary_key_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;

```

meine Tabelle:

```nohighlight
create table article (
  artID serial PRIMARY KEY,
  artName varchar
);

```

Wenn ich Einträge mit

```nohighlight
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

```nohighlight
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?

---

<div class="post-metadata">

### Author: ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)
#### Post date: [20. Oktober 2016 um 09:11 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/6 "2016-10-20T09:11:40Z")

</div>

> [@PatrickR](#):
>
> 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.

---

<div class="post-metadata">

### Author: ![frastr](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/f/919ad9/32.png) [@frastr](https://www.pg-forum.de/u/frastr)
#### Post date: [21. Oktober 2016 um 06:25 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/7 "2016-10-21T06:25:59Z")

</div>

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.

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

```

---

<div class="post-metadata">

### Author: ![PatrickR](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/2acd7d/32.png) [@PatrickR](https://www.pg-forum.de/u/PatrickR)
#### Post date: [21. Oktober 2016 um 15:24 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/8 "2016-10-21T15:24:01Z")

</div>

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.

---

<div class="post-metadata">

### Author: ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)
#### Post date: [21. Februar 2021 um 07:09 UTC](https://www.pg-forum.de/t/generated-pk-skipping-existing/9128/9 "2021-02-21T07:09:21Z")

</div>


