Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: buforowanie id
Forum PHP.pl > Forum > Bazy danych
DeyV
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?
itsme
dlaczego nie dajesz autonumerowanie na ID ?
DeyV
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...
dragossani
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ś.
dragossani
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.
DeyV
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
dragossani
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.
DeyV
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
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.