Hi,
ich habe eine einfache Tabelle mit einer einfachen SEQUENCE
1
CREATESEQUENCEgrp_id;
2
3
CREATETABLEGROUPS(
4
IDintegerNOTNULLDEFAULTnextval('grp_id'),
5
"GROUP"varcharNOTNULLUNIQUE,
6
FLD1integer,
7
FLD2integer,
8
FLD3integer,
9
PRIMARYKEY(ID,"GROUP")
10
)
11
;
soweit funktioniert das auch... aber wenn ich jetzt einen INSERT mit
CONFLICT mache, zählt die SEQUENCE auch, wenn ich gar keinen INSERT
sondern nur das "UPDATE" mache <- was ich natürlich nicht möchte.
Hat da jemand eine Idee, wie man das "umgehen" kann?
Hallo,
Nur eine Vermutung:
Das Insert wird durchgeführt und schlägt auf Grund des Constraint fehl.
Da das Insert aber durchgeführt wird, wird auch Deine Sequenz
hochgezählt.
Gruß
Frank
Was ist denn genau das Problem damit? Löcher in der Sequenz sind kein
Problem, solange sie nur monoton bleibt. Als sprechenden Schlüssel
sollte man automatische IDs sowieso nicht verwenden. Was willst Du denn
z.B. machen, wenn zwei Transaktionen die selbe Sequenz nutzen? Das ist
schon okay so und die haben sich dabei auch was gedacht:
Can There Be "Gaps" In The Values Generated By A Sequence?
Yes, there can. Sequences are intended for generating unique identifiers
— not necessarily identifiers that are strictly sequential. If two
concurrent database clients both attempt to get a value from a sequence
(using nextval()), each client will get a different sequence value. If
one of those clients subsequently aborts their transaction, the sequence
value that was generated for that client will be unused, creating a gap
in the sequence.
This can't easily be fixed without incurring a significant performance
penalty.
http://www.neilconway.org/docs/sequences/
Ergo schrieb:> Was ist denn genau das Problem damit? Löcher in der Sequenz sind kein> Problem, solange sie nur monoton bleibt. Als sprechenden Schlüssel> sollte man automatische IDs sowieso nicht verwenden. Was willst Du denn> z.B. machen, wenn zwei Transaktionen die selbe Sequenz nutzen? Das ist> schon okay so und die haben sich dabei auch was gedacht:
[...]
Genau. Und das ist nicht nur bei PostgreSQL so, sondern bei jeder
sinnvoll konstruierten relationalen DB.