Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Określenie kolejnych ID, których brakuje., Gdy pole PK ma ustawione AUTOINCREMENT
Sephirus
post
Post #1





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Witam (IMG:style_emoticons/default/wink.gif)

Mam ciekawy problem (wydajnościowy)

Muszę sprawdzać integralność danych tabeli (Czy ktoś czegoś nie usunął nie pozamieniał itd)...

Tabela ma strukturę:

Kod
ID (PK + AI) | pole1 | pole2 | ....


Jednym z wymogów jest wykrywanie czy w tabeli czasem nie ma "dziur". Co rozumiem przez dziurę:

Jeśli mamy rekordy o id 1,2,3,4,5,6,7,8,9,... to jest wszystko ok. Ale jeśli mamy 1,2,3,5,6,7,8,9,... (brakuje 4) to jest problem - rekord 4 został usunięty.

I teraz o co chodzi: Czy ktoś zna wydajny sposób na określenie tego, że w tej tabeli brakuje właśnie rekordu numer 4. Czyli chodzi mi o dowolny skrypt/funkcje/pomysł (najlepiej w samym SQL), który zwracałby w takim konkretnym przypadku "4".

Zaznaczam że samo wykrycie dziur (że są) nie jest problemem wystarczy pobrać AUTOINCREMENT i policzyć wiersze... i już wiemy czy są dziury czy nie - ale mi chodzi o określenie ID których brakuje...

Oczywiście można pobrać wszystko i sprawdzać po kolei... ale ta tabela będzie spora a sprawdzanie ma się odbywać często...

Bardzo proszę o pomysły i pomoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Hmm też się pokusiłem o to by sprawdzić, co prawda na mniejszej liczbie i znalazłem pewną przeszkodę (IMG:style_emoticons/default/smile.gif)

w tabeli miałem:

2
3
4
5
6
7
8
9
10
13
14
15
....

Czyli bez 1,11,12

SELECT zwrócił:

idzm roz
1 2
11 3

Czyli nie znalazł 12 (IMG:style_emoticons/default/tongue.gif)

Ale w sumie możną ją wydedukować i obliczyć już w PHP na podstawie:

11 - różnica to 3 zatem kolejny rekord to 11+3=14 (należy jeszcze odjąć 2 bo zaczynaliśmy od SET @zm = 0;)

Zatem z każdego zwróconego rekordu bierzemy zakres (od idzm do idzm+(roz-2))

Co da:

idzm roz id
1 2 1
11 3 11,12

I to mi wystarczy w zupełności (IMG:style_emoticons/default/biggrin.gif) (IMG:style_emoticons/default/smile.gif)

Dzięki!!
Jutro napisze jak śmiga na bazie 5mln+ (IMG:style_emoticons/default/wink.gif)


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: 8.10.2025 - 16:10