currval wurde in dieser Session noch nicht definiert, wie man Multi-Session-Sequenzen bekommt?
Mein Ziel ist es, eine primary key-Feld automatisch eingefügt, wenn das einfügen der neuen Zeile in der Tabelle.
Wie man eine Sequenz gehen von Sitzung zu Sitzung in PostgreSQL?
doubleemploi@hanbei:/home/yves$ psql -d test
Mot de passe :
psql (8.4.13)
Saisissez « help » pour l''aide.
test=> create sequence test001 start 10;
CREATE SEQUENCE
test=> select currval('test001');
ERREUR: la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session
--- current value not yet defined this session (???)
test=> select setval('test001', 10);
setval
--------
10
(1 ligne)
test=> select currval('test00');
currval
---------
10
(1 ligne)
test=> \q
test@hanbei:/home/yves$ psql -d test
Mot de passe :
psql (8.4.13)
Saisissez « help » pour l''aide.
test=> select currval('test001');
ERREUR: la valeur courante (currval) de la séquence « test00 » n''est pas encore définie dans cette session
Kommentar zu dem Problem - Öffnen
Der ganze Zweck einer Sequenz ist, haben es die session lokal. Sie kann nicht "von hand" die currval über zu einer anderen Sitzung. Warum denken Sie, dass Sie das brauchen? Warum nicht alles in einer einzigen Transaktion?
@a_horse_with_no_name da habe ich zwei session gleichzeitig geöffnet : ein admin und eine Produktion. Also ich habe zwei getrennte Sitzungen.
warum nicht eine einzelne Sequenz und dann einfach teilen Sie Sie zwischen zwei Sitzungen? Sie erhalten eindeutige ids, fertig.
InformationsquelleAutor der Frage MUY Belgium | 2012-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist vielleicht einfacher, als Sie denken ...
Einfach den default-Wert der Spalte:
Oder einfacher noch, erstellen Sie die Tabelle mit einem
serial
der Typ für den Primärschlüssel zu beginnen mit:Schafft es eine Sequenz gewidmet und setzt den Standard für tbl_id automatisch.
Diese Weise
tbl_id
zugeordnet ist, wird der nächste Wert aus der angefügten Sequenz automatisch, wenn Sie erwähnen es nicht in derINSERT
. Funktioniert mit alle Sitzung, gleichzeitigen oder nicht.Wenn Sie wollen, dass die neue
tbl_id
wieder etwas zu tun:InformationsquelleAutor der Antwort Erwin Brandstetter
Den
currval
werden, um den zuletzt generierten Wert für die Sequenz in der aktuellen Sitzung. Also, wenn noch eine session erzeugt einen neuen Wert für die Sequenz, die Sie noch abrufen können, die zuletzt generierten Wert, indem Sie IHRE Sitzung, Fehler zu vermeiden.Aber auch, um den zuletzt erstellten Wert auf alle Sitzungen, die Sie verwenden können, die oben:
Seien Sie vorsichtig, wenn der Wert wurde von einer anderen Sitzung mit einem ungebunden (oder abgebrochen) - Transaktion und verwenden Sie diesen Wert als Referenz, erhalten Sie möglicherweise eine Fehlermeldung. In der Regel Menschen, die brauchen nur die
currval
oder sogar die Rückkehr vonsetval
.InformationsquelleAutor der Antwort MatheusOl
Eigentlich nextval wird Voraus-Sequenz und der neue Wert wird zurückgegeben, damit wäre die Antwort auf deine Frage.
currval wird der Wert zuletzt erhalten mit nextval für angegebenen Reihenfolge (obwohl Dies möglicherweise nicht, wenn es nicht nextval in der aktuellen Sitzung).
InformationsquelleAutor der Antwort Jalal
Diese Frage scheint zu sein, intermittierende , Für die Konsistenz verwenden CTE zu bekommen eingefügte Sequenz für die aktuelle Sitzung
MIT eingefügt (
INSERT INTO notifn_main (notifn_dt,stat_id)
WÄHLEN Sie now(),22
VON notifn
RÜCKKEHR-id )
SELECT id
von eingefügt tmp_id;
InformationsquelleAutor der Antwort Sandeep naik
Gebe ich eine praktische Antwort für diese Frage.
Meine Datenbank-server wird von meine Programme und meine psql-terminal; es sind also mehrere Sitzungen. zurzeit bin ich in meine psql-terminal:
Sieht es aus, können Sie nur die Werte angezeigt, die in Ihrer eigenen session. Dies wird auch Auswirkungen auf die currval von einer anderen Sitzung. Dies ist wahrscheinlich im Zusammenhang mit multi-threading der server zu isolieren, die andere session. Der Zähler (serial in psql) ist ein gemeinsames Objekt. Meiner Meinung nach, diese Sitzung sollte in der Lage sein, um den aktuellen Wert des Zählers, solange der Zähler richtig verschlossen ist, um sicherzustellen, dass nur ein einzelner thread (Sitzung) kann Inkrement (Atomare operation). Aber ich könnte hier falsch sein (kein Experte auf dem Datenbank-server Schriftsteller).
InformationsquelleAutor der Antwort Kemin Zhou