Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> id ostatnio włożonego elementu
nie ja
post
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

  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 ...


?

Ten post edytował nie ja 30.10.2005, 17:09:36
Go to the top of the page
+Quote Post
nospor
post
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
Go to the top of the page
+Quote Post
nie ja
post
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');
Go to the top of the page
+Quote Post
msulik
post
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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.09.2025 - 16:56