Funkcja auto_increment nadaje wartości nieistniejącym rekordom

Mam problem z bazą danych w MySQL kiedy nadaję ID auto_increment to rekordy numerują się dobrze , do czasu kiedy jakiś dodam ręcznie, wtedy przy wpisywaniu rekordu przy pomocy ‘insert into’ rekord dostaje numer o 3 większy od poprzedniego jeśli następnie dalej dodaję też za pomocą ‘insert into’ czy ‘load data’  numerują się ok. I znów to samo dzieje się przy dodawaniu przez ‘insert into’… Ktoś wie jak się tego pozbyć?

Olać? Założenia sztucznego klucza głównego są takie, że musi być unikalny, ale nie musi być kolejny. Dziury i tak kiedyś powstaną na skutek usuwania rekordów.

heh…najłatwiej jest olać ale czy nie ma jakiegoś sposobu na to tak jakby można to zrobić w jakimś języku programowania typu warunku, że kolejna liczba jest większa o ileś od poprzedniej?

Poczekaj, bo teraz to już cie nie rozumiem. Dodajesz sobie 3 wiersze od id = 1, 2, 3 i potem chcesz dodać czwarty wiersz o id równym np. 6?

Znaczy się, czasami ręcznie ustalasz zawartość pola typu auto_increment? Nie rób tego…

Nie, chodzi o to, że auto_increment samo zwiększa wartość pola id, a pozostałe pola (marka, model) są wypełniane z zewnętrznego pliku dane.txt i jeśli chcę dodać jeszcze jeden wiersz tabeli nie z tego pliku to wtedy wartość pola id zwiększa się nagle o 3, chociaż ja nic w pole id nie wpisuję.

Nie jest to możliwe, autoincrement nie wie nic o źródle danych. Najwidoczniej pierwszy skrypt coś robi. Spotkałem się z czymś takim, kiedy używałem JPA (albo JDO nie pamiętam) w połączeniu z postreSQL i cache-owaniem sekwencji. Domyślnie rezerwowało 50 kluczy, a nie wykorzystane odrzucało. Być może pierwszy skrypt robi coś podobnego, nie da się nic na to poradzić, niż olać, nie ma to znaczenia klucze główne powtarzam, nie muszą być kolejne, muszą być unikalne.

Pod warunkiem, że usuwa się rekordy. Zazwyczaj się tego nie robi. 

 

I co z tego? ID jest dla SZBD, nie dla aplikacji, użytkownika ani Ciebie.

Jak piszą poprzednicy, olej to, ID nie jest dla ciebie i jego kolejność nie ma najmniejszego znaczenia. Ale jak tak bardzo chcesz się dowiedzieć co się dzieje to użyj profilera (ja znam go z MS SQL Servera) z tego co na szybko poszukałem to jakiś tutaj jest

http://web.archive.org/web/20110609054749/http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

Ok, dzięki za odpowiedzi :wink: