![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 16.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
chodzi mi o to że do bazy danych wkładam, przy pomocu php jakiś rekord
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 ... ? Ten post edytował nie ja 30.10.2005, 17:09:36 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 16.02.2005 Ostrzeżenie: (0%) ![]() ![]() |
znalazłam już odpowiedź (IMG:http://forum.php.pl/style_emoticons/default/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');
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 0 Dołączył: 31.03.2002 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował msulik 1.11.2005, 18:24:38 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.09.2025 - 16:56 |