Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> buforowanie id
DeyV
post 26.03.2003, 10:45:24
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




By dodać nowy wiersz (produkt) do bazy, przed procesem wprowadzania danych, muszę pobrać numer id, który dany rekord otrzyma.
Pobieram go prostym zapytaniem MAX (id) +1. Później juz tylko przesyłam ten numer, aż do momentu dodania nowego produktu.
Rozwiazanie takie ma jednak wadę - możliwe jest, że w trakcie gdy jeden użytkownik wprowadza dane, inny rozpocznie ten samą czynność i otrzyma ten sam numer id. Stąd pojawia sie konieczność wprowadzenia mechanizmu rezerwowania numerów, czyli oznaczania, które numery id są właśnie wykorzystywane.
Zrobiłem to na zasadzie osobnej tablicy, zawierającej kolumny [i]id_wprowadzanego_produktu i data [i]
Jednak mam problem. Nie wiem jak pobrać numer wiersza, dla którego nie istnieje jeszcze produkt i który nie jest zarezerwowany, lub rezerwacja jest "przestarzała"
A może macie jakieś inne rozwiazania?


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
itsme
post 26.03.2003, 11:19:45
Post #2





Grupa: Zarząd
Postów: 1 512
Pomógł: 2
Dołączył: 22.04.2002
Skąd: Koszalin




dlaczego nie dajesz autonumerowanie na ID ?


--------------------
brak sygnaturki rowniez jest sygnaturką
Go to the top of the page
+Quote Post
DeyV
post 26.03.2003, 11:26:44
Post #3





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Oczywiście że "dajesz". Jednak nie chcę dodawać produktu już na wstępie, jak jeszcze nic o nim nie wiem. Przecież użytkownik może przerwać proces dodawania w każdym momencie, i zostałby pusty wpis.
Za dużo później z takimi zabawy...


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
dragossani
post 26.03.2003, 12:02:38
Post #4





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Może tak:
Na początku skryptu dodajesz nowy rekord do bazy ale nie wypełniasz go danymi. Chodzi tylko o stowrzenie rekordu o nowej wartości w polu typu AUTOINCREMENT. Zczytujesz mysql_insert_id() - nie obawiaj się, że dostaniesz identyfikator wygenerowany w międzyczasie przez innego usera - mysql_insert_id() dotyczy tylko bierzącego połączenia klienckiego z bazą danych. Jak już masz ID, zapisujesz go jako zmienną sesji i lecisz przez formularze, aż będziesz miał komplet danych. Na końcu ropisz UPDATE w rekordzie z ID, które przechowałeś.


--------------------
cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
Go to the top of the page
+Quote Post
dragossani
post 26.03.2003, 12:05:36
Post #5





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Jeśli chodzi o puste wpisy przy przerwaniu transakcji to musiałbyś przeryć funkcje MySql związane z obsługą transakcji (sprawdź najpierw czy Twoja werjsa je obsługuje). Możesz wtedy cofać niezakończone poprawnie transakcje. Możesz też spróbować sklepać własny mechanizm do czyszczenia bazy z takich wpisów.


--------------------
cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
Go to the top of the page
+Quote Post
DeyV
post 26.03.2003, 12:29:25
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Rzeczywiście - zastosowanie transakcji mogłoby być dobrym rozwiazaniem, tyle ze chyba nieco obciażającym serwer.
2. Osobiscie rónież zacząłem od tworzenia pustych wpisów. NIestety, ale okazało się, że męczące będzie "pamiętanie" o tym, by nigny nie wyciagać pustych wpisów. So prawda wystarczyłaby osobna kolumna, ale jednak, koniczne byłoby przerabianie struktury zapytań. Stąd też pomysł zastosowania odobnej tabeli.
W ttej chwili doszedłem do tego, że:
a) Sprawdzam czy w buforze istneje jakiś stary wpis
1. jeśli tak - pobierazm id i aktualizuję datę wpisu,
2. jeśli nie -
TU POJAWIA SIĘ PROBLEM
Chcę dadać do bufora id produktu, którego nie mam jeszcze ani w buforze, ani w tabeli produktów


i dalej pracuję z tym id

cool.gif dodaję produkt
c) usuwam z bufora juz wykorzystany w tabeli produktów id


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
dragossani
post 26.03.2003, 13:02:41
Post #7





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Pamiętaj, że wynik zapytania SELECT MAX(id)+1 FROM tabela nie daje odpowiedzi na pytanie jaki będzie następny wstawiony do tej tabeli identyfikator. Niekoniecznie będzie to wynik tego zapytania. Ciąg wstawianych identyfikatorów jest nieustannie rosnący. Identyfikatory usuniętych rekordów nie są ponownie używane.

Aby nie generować pustych rekordów w tabeli docelowej możesz stworzyć sobie tabelę o jednym rekordzie, służącą wyłącznie generowaniu kolejnego identyfikatora. Czyli na początek:
Kod
CREATE TABLE identyfikatory (id INT UNSIGNED NOT NULL)

INSERT INTO identyfikatory VALUES(0)
a potem jak potrzebujesz identyfikator to:
Kod
UPDATE identyfikatory SET id=LAST_INSERT_ID(id+1)

SELECT id FROM identyfikatory
Ten identyfikator tworzysz przed samym zapisem danych i wrzucasz go ręcznie jako klucz główny nowo tworzonego rekordu w tabeli z produktami.


--------------------
cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
Go to the top of the page
+Quote Post
DeyV
post 26.03.2003, 13:25:37
Post #8





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




I o to chodziło Dzięki Ci wielkie.
Wraz z połączeniem z tablą buforu (w celu zachwania spójności w kolejnosci produktów) osiagnąłem zamierzony cel.
W ten sopsób można osiagnąć to, czego nie można było wyciagnać przy pomocy MAX(id) - wiedzałem że to nie o to chodzi - ale brak było lepszego pomysłu.
Jeszcze raz th'x


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 10.06.2024 - 05:15