• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tabela po usunięciu rekordu indeksuje niepoprawnie

Object Storage Arubacloud
+4 głosów
1,561 wizyt
pytanie zadane 6 kwietnia 2015 w SQL, bazy danych przez zirael [PL] Mądrala (5,200 p.)

Witam,

w panelu administratora napisanym w PHP, wykonuje operacje usuwania rekordu z bazy danych. Dodając kolejny rekord nie wskakuje w miejsce usuniętego, tylko id inkrementuje od ostatniego indeksu. Wtedy wyjmowanie id wygląda w ten sposób:

1,2,3,4,6,7... Nie występuje id o numerze 5, bo został usunięty. Dodając następne id do bazy zamiast na miejscu usuniętego id 5, tworzy o numerze 8.

Jak przesunąć kolejność indeksowania po usunięciu rekordu z tabeli?

2 odpowiedzi

+3 głosów
odpowiedź 6 kwietnia 2015 przez GrzesiekB Gaduła (3,720 p.)
wybrane 6 kwietnia 2015 przez zirael [PL]
 
Najlepsza

Rekordy w bazie mają mieć unikalne id aby jednoznacznie identyfikować rekord. Usuwasz rekord - nie ma go w bazie, ale id tego rekordu już się nie powtórzy. Zapobiega to tworzeniu się błędnych relacji.
Z punktu widzenia programisty id ma być jednoznacznym określeniem danego rekordu i nie ma znaczenia jakie to id będzie, czy w kolejności czy nie, tym bardziej, że nie zawsze wyciągasz z bazy kolejne rekordy.
Podam Ci przykład.
Masz sklep z książkami w necie, przy każdej książce podajesz odwiedzającemu jej id w celu łatwiejszego odszukania przez klienta, gdy podejmie decyzcję zakupową.

Klient znalazł sobie książkę id: 50 ("Jak otworzyłem w 2 dni polskiego stackoverflow" autora Mirosław Zelent :)) ).
Kolo jednak nie miał jak zapłacić przez neta - zadzwonił do "mamuśki" i mówi - kup mi książkę id 50.

W tym samym czasie jednak kasujesz tą pozycję bo Ci się sprzedała, a dodruku tej wersji nie będzie i w to miejsce wstawiasz książkę "10 sposobów na przygotowanie miodu" autora Kubuś Puchatek.

No i co ten klient zrobi teraz z taką książką, skoro chciał zupełnie inną, którą jasno określił po ID?

Mam nadzieję, że obrazkowo wyjaśniłem problem ;)
i mam też nadzieję, że MZ nie będzie miał mi tego za złe (jeśli tak, przemoderuj proszę moją wypowiedź).
 

komentarz 6 kwietnia 2015 przez zirael [PL] Mądrala (5,200 p.)
Tak, dziękuję, właśnie o coś takiego "obrazowego" mi chodziło ;)
komentarz 6 kwietnia 2015 przez GrzesiekB Gaduła (3,720 p.)
Cieszę się, że mogłem pomóc.
Początkowo też miałem ze wszystkim problemy i stawiałem sobie czasem dziwne pytania (uczę się przez zrozumienie zasady działania) - z biegiem kilku zadań/projektów będziesz się śmiał z tego o czym teraz piszemy i nie będzie wątpliwości dlaczego tak się dzieje - uznasz nawet, że inaczej nie można :)
+1 głos
odpowiedź 6 kwietnia 2015 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie będzie to może odpowiedź na pytanie ale od razu mi się nasuwa takie pytanie: po co? Takie numerowanie jest w pełni poprawne. Identyfikator w założeniu ma być unikalny i nie ma sensu go przesuwać. Dajmy na to, że wskazuje on na jakiegoś użytkownika. No i teraz co po jego usunięciu w jego miejsce pojawi się nowy? Załóżmy, że pozostały nie usunięte jakieś wpisy starego (usuniętego) użytkownika i co okaże się, że teraz jakby kto inny jest ich autorem?

Jak dla mnie takie coś jest jak najbardziej prawidłowe i nie zmieniałbym tego, gdyż gwarantuje to pełną unikalność.
komentarz 6 kwietnia 2015 przez zirael [PL] Mądrala (5,200 p.)
Zgadzam się z Twoją odpowiedzią, ale pomimo że id o numerze 5 zostało usunięte, to przy tworzeniu nowego nie mógł go wypełnić, tylko została luka w numeracji..
komentarz 6 kwietnia 2015 przez Arkadiusz Waluk Ekspert (287,950 p.)

No i tak ma być bo jak już napisałem gwarantuje to unikalność. Gdyby nie to, po usunięciu jakiegoś rekordu w jego miejsce mógłby wpakować się inny i narobić bałaganu tak jak napisałem wyżej w przykładzie. To, że występuje tam jakaś luka w numeracji nie jest chyba żadną przeszkodą prawda? Przecież i tak wszystkie funkcje (np. sortowanie) działają prawidłowo bo po prostu wartości nie ma i tyle.

Co do tego jak to zrobić to chyba nie ma innego sposobu jak ręczna zmiana id poprzez UPDATE każdego rekordu a później przestawienie AUTO INCREMENT na odpowiednią wartość o ile dobrze pamiętam takim poleceniem:

ALTER TABLE tabela AUTO_INCREMENT=5;

Jednak w dalszym ciągu nie widzę sensu, aby komplikować coś, co jest zrobione dobrze.

komentarz 6 kwietnia 2015 przez zirael [PL] Mądrala (5,200 p.)
Dziękuję za odpowiedź :)

Podobne pytania

0 głosów
3 odpowiedzi 247 wizyt
0 głosów
3 odpowiedzi 2,342 wizyt
+1 głos
1 odpowiedź 127 wizyt

92,618 zapytań

141,467 odpowiedzi

319,785 komentarzy

62,000 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...