[PostgreSQL] skad wziac ID ostatniej operacji INSERT

Odpowiedz Nowy wątek
2006-09-10 18:41
0

Baza : PostgreSQL
Keidy wstawiam jakis rekord to jak wyczaic ID ostatnio dodanego rekordu
czy jest na to jakas wbudowania funkcja z bazy ?

Pozostało 580 znaków

2006-09-10 19:13
0

a masz nałożonmy jakiś klucz główny typu serial?

jeżeli tak to zrób

    select curval("nazwa_twojego_klucz_który_znajduje_się_w_sequencies");

Daj człowiekowi cracka a jutro znowu bedzie głodny. Naucz go crackować a już nigdy nie będzie głodny.

Pozostało 580 znaków

2006-09-10 19:43
0

tak mam klucz glowny typiu serial jako int4 zaraz wyproboje to zapytanie byloby extra gdyby zadzialalo.

Chcialbym wykluczyc taka ewentualnosc ze dwie osoby dodaja cos w tym samym czasie i teraz:
osoba A i osoba B otwieraja pole do dodawania jakiejs informacji
osoba A i osoba B dodaja w tym samym czasie jakies linijki do bazy
powiedzmy ze kazdda z osob dodaje po 1000 rekordow
czyli jesli jedna wcisnie DODAJ i druga wcisnie DODAJ
to czy istnieje szansa ze te wiersze sie dodaja naprzemian ?
czy jesli ktoras z osob zaczela dodawanie to druga czeka az ta jedna skonczy ?

gdyby jednak dzialo sie ze wiersze sa dodawane np na przemian ze moze sie zdarzyc
ze 3 wiersze sstem dospial od osoby B i 4 wiersze osoby A i znwou 2 wiersze osoby B
az tak do 2000 wierszy to czy to zapytanie powyzsze bedzie dzialac? czy to zwroci mi
ID ostatniej operacji INSERT ?

Pozostało 580 znaków

2006-09-10 20:19
0

trzeba rozpatrzyć tutaj TRANSAKCYJNOŚĆ bazy danych.

dla przykładu w php będzie to takk (oczywiście pomijam kwestie nawiżania połączenia ;) )

     $zmienna = pg_query($connection, "insert bal bla bla; select curval('nazwa sekwencji')");

w tym wypadku nie ma możliwości żeby ci zwróciło coś innego.


Daj człowiekowi cracka a jutro znowu bedzie głodny. Naucz go crackować a już nigdy nie będzie głodny.

Pozostało 580 znaków

2006-09-10 22:41
0

Robi się to tak:

jak wstawisz insertem to wywołujesz funkcję php pg_last_oid() a nastepnie pobierasz serial, w ten sposob:

czyli:

$last_oid=pg_last_oid($result);
$query="SELECT id FROM tabela WHERE oid=$last_oid";

Oczywiście musisz mieć tabelę z OIDami.


Pozostało 580 znaków

2006-09-10 23:11
0

o wlasnie musze wlaczyc OIDy czyli to sa unikalne indexy tak?
ta funkcja pg_last_oid(); to jest wbudowana w PostgreSQL`a ?
bo ja pytalem o czyste wywoalnie funkcji nie w php tylko tak zeby zwrocic to w samej konsoli bazy danych. czy musze sobie jakas funkcje sam zbudowac ?

p.s. nie wiem jak wlaczyc OID w danej tabeli jak to zrobic ?

Pozostało 580 znaków

2006-09-10 23:13
0

hmm oidy to oidy ;-) są unikalne dla całego serwera postgresa, poczytaj o tym.
pg_last_oid() jest funkcja php, w postgresie tego nie ma. Tzn to jest chyba tak, że zapytanie insert zwraca ten oid, a ty sobie go tym po prostu pobierasz.


Pozostało 580 znaków

2006-09-11 00:20
0
jmail napisał(a)
$zmienna = pg_query($connection, "insert bal bla bla; select curval('nazwa sekwencji')");

w tym wypadku nie ma możliwości żeby ci zwróciło coś innego.

W tym też nie:

     pg_query($connection, "insert bal bla bla;");
     pg_query("select currval('nazwa sekwencji')");

Wystarczy poczytać FAQ PostgreSQL'a:

4.11.3) Doesn't currval() lead to a race condition with other users?

No. currval() returns the current value assigned by your session, not by all sessions.

Szukanie nie boli.


"Angels that are forced from heaven
Have to become demons"
- Vicious

Pozostało 580 znaków

2006-09-11 00:28
0

@Elmo: to nie zadziała. Jeśli dopiero co połączyłbyś się z bazą i chciał pobrać currval-em tą wartość, to ci nie zwróci, dopiero po pierwszym wstawieniu (czyli po pierwszym wykorzystaniu sekwencji z seriala) będziesz mógł dostać obecną wartość, dlatego lepiej to zrobić wykorzystując OIDy.


Pozostało 580 znaków

2006-09-11 02:56
0
wowo napisał(a)

hmm oidy to oidy ;-) są unikalne dla całego serwera postgresa

dopóki się im licznik nie "przekręci" ;-P


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-09-11 08:11
0

taaa misiekD zawsze czlowieka pocieszy :} ale
mam nadzieje ze ten licznik duzy jest raczej

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: Googlebot