Wyciąganie currval dopiero
PO wstawieniu rekordu może spowodować taką sytuację: Klienci A i B jednocześnie wstawiają rekord do bazy:
1. Klient A wstawia rekord. Zwiększana jest aktualna wartość sekwencji (np. na 11).
2. Klient B wstawia rekord. Zwiększana jest aktualna wartość sekwencji (np. na 12).
3. Klient A wyciąga currval - otrzymuje 12.
4. Klient B wyciąga currval - otrzymuje 12.
Wydaje mi się, że lepiej zrobić tak:
Najpierw klient wyciąga nextval('nazwa_sekwencji'). Nextval za jednym zamachem zwiększa wartość sekwencji i zwraca tę zwiększoną wartość, zatem klient od razu rezerwuje i otrzymuje unikatową wartość, np. 11. Następnie klient wstawia rekord, podając wyciągnięte przed chwilą ID:
INSERT INTO tabela(id, pole1, pole2) VALUES(11, "xyz", "abc")
W styuacji z dwoma klientami będzie to wyglądać tak:
1. Klient A wyciąga nextval('nazwa_sekwencji') i otrzymuje np. 11.
2. Klient B wyciąga nextval('nazwa_sekwencji') i otrzymuje 12.
3. Klient A wstawia rekord, podając ID wyciągnięte w swoim kroku 1:
INSERT INTO tabela(id, pole1, pole2) VALUES(11, "xyz", "abc")
4. Klient B wstawia rekord, podając ID wyciągnięte w swoim kroku 2:
INSERT INTO tabela(id, pole1, pole2) VALUES(12, "pqr", "qwe")
I wszystko jest tak jak chcieliśmy.
SERIAL w PgSQL to tak naprawdę nie jest typ danych. W momencie tworzenia tabeli z kolumną K "typu" SERIAL tworzona jest sekwencja na podstawie nazwy tabeli, następnie typ kolumny K jest ustawiany na integer, a kolumnie K jako default przypisywane jest wyrażenie nextval('nazwa_sekwencji').
Jest to opisane tutaj:
http://www.postgresql.org/docs/8.0/interac...DATATYPE-SERIAL