http://pl.wikibooks.org/wiki/PHP/Zarz%C4%85dzanie_rekordamiCytat
Wykonując wiele zapytań DELETE oraz INSERT zauważysz, że pozostają Ci luki w numeracji. Spróbuj dodać teraz jakiś rekord. Jeżeli wykonałeś wcześniej zapytanie kasujące ten o ID 3, MySQL pozostawi tam lukę, nadając nowemu rekordowi następny w kolejności ID - 4. Prawdopodobnie z przyczyn estetycznych niektórym nowym programistom to zachowanie przeszkadza, lecz jest to zupełnie błędne podejście do problemu. Jak wspomnieliśmy bowiem, MySQL jest relacyjną bazą danych, w której rekordy z jednej tabeli mogą być połączone odpowiednimi relacjami z rekordami w drugiej. Wyobraźmy sobie więc, co by się stało, gdybyśmy skasowali jakąś kategorię np. newsów w naszym serwisie, a potem dodali nową i okazało się, że MySQL zaliczył w jej poczet wszystkie newsy z tej usuniętej, gdyż nowy rekord zajął pustą lukę w numeracji. Działanie takie stwarza poważne zagrożenie synchronizacji bazy i wprowadza w nią element losowości. Dlatego zaufaj twórcom serwerów DB, oni naprawdę znają się na rzeczy i nie podejmuj zbędnych prób zmieniania na gorsze tego, co wyraźnie służy zarówno tobie, jak i twojej bazie.
Naprawdę musisz to zmieniać? Jeśli gdzieś wykorzystujesz numerowanie z bazy danych jako kolejne to zmień to. Dać zapytanie do bazy, żeby zwróciło kolejne rekordy numerowane w kolejności.
Jeśli koniecznie chcesz to pierwsze co mi na myśl przychodzi to pętla w php z zapytaniem do bazy. Odczytuje rekord i zapisuje (zapisując id jako kolejny przebieg pętli).
Możliwe, że da się to też zrobić samym sql-em.