Unique Constraint-Fehler

Es gibt einen Einfügungscode. Beim Aufrufen der Prozedur aus den Batch-Jobs. Dies gibt einen Fehler.

Versucht ON CONFLICT() DO nichts zu vermeiden, aber dieser Ansatz ist nicht hilfreich. Dann habe ich versucht, die Sequenz zurückzusetzen.

Bitte schlagen Sie die beste Lösung vor.

FEHLER: Doppelter Schlüsselwert verstößt gegen Unique Constraint „bkfd_bt_sum_pk“
DETAIL: Schlüssel (rbn)=(2003638) existiert bereits.

TUN $$
ERKLÄREN
seq_maxval bigint;
seq_inc_by pg_sequences.increment_by%type;
START
select increment_by in seq_inc_by von pg_sequences
wobei schemaname =‘abc_feed’
und Sequenzname =‘rbn’;

 select coalesce(max(rbn),0)+seq_inc_by into seq_maxval from
 abc_feed.bkfd_bt_sum;
 PERFORM setval('abc_feed.rbn'::regclass, seq_maxval,true);

ENDE;
$$


FEHLER: Relation “abc_feed.rbn” existiert nicht
ZEILE 1: SELECT setval(‘abc_feed.rbn’::regclass, se…

ich blick nicht ganz durch, was Du erreichen willst. Wenn es eine Constraintverletzung gibt, dann ist das dann halt so. Wie ist die Tabell definiert, und warum versuchst Du einen Wert für eine Sequence vorzugeben, wenn Du doch eine Sequence hast? Das ergibt wenig bis keinen Sinn.

Den Namen einer Sequence bekommst Du bei \dt abgezeigt, nebenbei.

1 „Gefällt mir“

Ich vermute(!) flight versucht “Lücken” in der Sequence zu vermeiden die durch INSERT ON CONFLICT entstehen (selbst wenn kein Datensatz eingefügt wird, wird die Sequence weitergeschaltet).

@Flight: Lücken in einer Sequence sind normal, erwartet und nichts wogegen man etwas tun muss. Die einzige Aufgabe für einen generierten Werte eines Primary key ist es eindeutig (unique) zu sein.

Es ist völlig unerheblich ob dieser Wert 1, 2, 9346, -433425 oder 42 ist (solange er eindeutig ist)

2 „Gefällt mir“

Eigentlich, um dieses einzigartige Einschränkungsproblem zu vermeiden. Ich verwende bei Konflikten nichts, aber das ist keine kluge Lösung.

Ich stehe vor rbn = 123456 existierte bereits.

Was ist dann die Lösung? @castorp

Dann sind die Sequence und die Werte in der Tabelle auseinander gelaufen (vermutlich weil Du INSERTs mit Konstanten Werten gemacht hast - ohne Verwendung von nextval())

Du musst die Sequence einmal synchronisieren, danach sollte das Problem nicht mehr auftreten (solange Du nicht wieder INSERTs ohne Verwendung der Sequence machst):

select setval('abc_feed.rbn', coalesce(max(rbn),1))
from abc_feed.bkfd_bt_sum;

oder ganz dynamisch wenn die Spalte als serial definiert ist:

select setval(pg_get_serial_sequence('abc_feed.bkfd_bt_sum', 'rbn'), coalesce(max(rbn),1))
from abc_feed.bkfd_bt_sum;

Das ist einer der Gründe warum man statt serial eine identity Spalte mit generated always as identity verwenden sollte. Dann kann man nicht “aus Versehen” vergessen, die Werte von der Sequence generieren zu lassen.

2 „Gefällt mir“

@castorp Sicher Danke