Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: id ostatnio włożonego elementu
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
nie ja
chodzi mi o to że do bazy danych wkładam, przy pomocu php jakiś rekord

  1. <?php
  2.  
  3. $result = pg_exec ($handle, "insert into tab1 (wart1, wart2,...) values ('$cos1', '$cos2',...)");
  4.  
  5. ?>


tab1 ma oczywiście pole typu serial tab1_id, które generuje się automatycznie.

potrzebuję uzyskać szybko tab1_id własnie wkładanego/włożonego elementu
czy jest na to inny sposob niz zadanie selecta do bazy:
Kod
select tab1_id from tab1 where wart1='.$cos1 ...


?
nospor
Bardziej mi to pasue na Bazki niz na php. PRzenosze.
Na Postrgresie sie nie znam, ale tu maz link jak w mysql to zrobili. moze ci sie przyda:
http://forum.php.pl/index.php?showtopic=30312&hl=ostatnie+id
nie ja
znalazłam już odpowiedź smile.gif napiszę, moze się komuś jeszcze przyda

w przypadku PostgreSQl jest to funkcja currval('nazwa sekwencji')

gdzie nazwa sekwencji ma postac : <nazwa_tabeli>_<kolumna>_seq

czyli przykładowo: tabela : tab1, pole typu serial: tab1_id

Kod
select currval('tab1_tab1_id_seq');
msulik
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.