Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Ograniczenia wielkości rekordów
vegeta
post
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 9.11.2008

Ostrzeżenie: (10%)
X----


Witam.

Czy jest sposób, żeby dana tabela zawierała maksymalnie X rekordów? Na przykład mam Shoutbox i chcę w bazie trzymać tylko 50 rekordów. Po wysłaniu nowej wiadomości automatycznie kasuje się ostatni wpis w tabeli. Czy obejdzie się to bez PHP (można to zrobić w PHP, ale ja chcę zautomatyzowany proces w samym MySQL)?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A ja myślę o prostszym rozwiązaniu. Skoro już pobiera informacje z bazy i wie ile ma rekordów to sprawa jest prosta...

Znasz swój limit = 50
Dodajesz nowy rekord bez sprawdzania ilości
Sprawdzasz ilość.
Jeśli jest większa niż limit robisz delete z takim limit ile wystaje ponad niego.

Przykładowo masz 50 i dodałeś do shouta. Zwróci Ci count 51 a więc musisz zrobić delete dla 51-50=1 (IMG:style_emoticons/default/smile.gif)
W efekcie zamiast zarżynać bazę zapytaniami robisz proste 2 lub 3 query w zależności czy osiągnąłeś limit czy nie:

INSERT INTO shoutbox2 jakieś dane; <-zawsze.
SELECT count(id) AS ile FROM shoutbox2; <-zawsze, to lepsze i szybsze niż robić select * i jeszcze potem po stronie php to obliczać, co jest głupotą i marnotrawieniem czasu.
DELETE FROM shoutbox2 LIMIT policzona różnica <- opcjonalnie, a i tak zazwyczaj będzie tutaj 1, jeśli już do usuwania dojdzie.

Widzisz jak Twoje całe kombinowanie się upraszcza?
  1. $limit = 50;
  2. $zapytanie_dodanie = mysql_query('INSERT INTO shoutbox2 jakieś_dane');
  3. $number = mysql_result( mysql_query ('SELECT count(id) AS ile FROM shoutbox2'), 0, 0 );
  4. if( $number > $limit ) {
  5. $zapytanie_usuniecie = mysql_query ('DELETE FROM shoutbox2 LIMIT '.($number-$limit));
  6. }
To jest całość dodawania rekordu wraz z usuwaniem nadmiarowych ponad limit... Takie coś jest już żywcem w sumie do zastosowania.

EDIT: Może wyjaśnię czemu tak... Sprawa jest prosta (IMG:style_emoticons/default/smile.gif) DELETE wywala wszystkie rekordy lecąc od początku tabeli do jej końca. Jeśli więc zrobimy mu LIMIT to wywali X pierwszych wpisów. Skoro wiemy ile mamy ogółem, ile mamy jako limit, to wiemy ile jest ponad stan i tyle mu każemy z początku usunąć. Myślę, że to jedno z najprostszych i jednocześnie bardziej eleganckich bez używania transakcji, która jeszcze bardziej by to zabezpieczyła. Jeśli zaś całość zapiszesz jako procedurę w mysql to masz po prostu rakietę, bo całość nawet nie wyjdzie poza silnik bazy.
Powód edycji: [thek]: Wyjaśnienie
Go to the top of the page
+Quote Post

Posty w temacie


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: 3.10.2025 - 12:19