2008-10-31 14 views
5

Po DBs do not reuse numbers of deleted records możliwe jest, że zabraknie liczb, zwłaszcza jeśli nie wybierzesz tak naprawdę dużej liczby całkowitej dla tej kolumny.
Co by się stało i jak temu zapobiec, jeśli jest źle?Co stanie się, gdy w silniku DB zabraknie liczb do użycia dla kluczy podstawowych?

// SQL Server, MySQL //

+1

Przy okazji, możesz ponownie użyć numerów z usuniętych rekordów; przeczytaj moją odpowiedź na poprzednie pytanie ... –

+0

Dziękuję. Ale ta funkcja to w rzeczywistości błąd. : | –

+2

Zgłoszono to jako błąd, ale status zgłoszenia błędu mówi "Nie jest to błąd".Musi więc to być funkcja :-) –

Odpowiedz

4

myślę dokładnie to, co się dzieje, będzie zależna od której silnik bazy danych używasz (może być nawet różnice między InnoDB oraz MyISAM w MySQL). Cokolwiek się stanie, to nie będzie piękne.

Po prostu trzeba zmienić typ kolumny na większą liczbę całkowitą.

2

For MySQL, it is documented that:

The behavior of the auto-increment mechanism is not defined if a user assigns a negative value to the column or if the value becomes bigger than the maximum integer that can be stored in the specified integer type.

+0

Nie zdefiniowano lepiej niż automatyczne zastępowanie/ponowne używanie nieużywanego identyfikatora, co może wpłynąć na zależność tabeli tabeli. – faulty

+1

Z pewnością "nie zdefiniowane" może oznaczać ponowne wykorzystanie identyfikatorów? – biozinc

1

Tak, jest to możliwe: jeśli zezwalasz tylko na 2-cyfrowe numery, możesz mieć tylko identyfikatory do 99 i tak dalej. Wstawianie zakończy się niepowodzeniem po osiągnięciu limitu. Wybór odpowiedniego rozmiaru to kwestia zdrowego rozsądku.

9

Kończysz z przestojami trwającym ponad 3 godziny, takimi jak Slashdot w funkcji ich komentarzy.

+0

Och, pamiętam też ten dzień! Naprawdę to mnie zszokowało. – willasaywhat

2

Większość systemów baz danych ma typ danych numerycznych, które mogą być szersze niż 32 bitów. Jeśli spodziewasz się więcej niż 2^32 rekordów, powinieneś użyć odpowiedniej szerokości klucza.

1

To zależy od Twojej bazy danych, wierzę w MS SqlServer, po prostu nie możesz wstawić żadnych nowych wierszy, dopóki nie rozwiążesz problemu. Ostatnim razem, gdy go spotkałem, naprawiliśmy problem, przesuwając kolumnę tożsamości na 1. To oczywiście nie jest uniwersalna poprawka, ale było dobrze z naszą sytuacją.

0

Oracle nie obsługuje autoinkrementacyjnych kolumn ID, a standardowa praktyka polega na użyciu generatora sekwencji. Sekwencja generuje liczby całkowite składające się z maksymalnie 28 cyfr, więc jeśli ich nie ma, to ... Sądzę, że masz całkiem spory stół. Ale zachowanie byłoby wtedy zależne od konfiguracji generatora sekwencji - albo błąd, albo cofnąłby się do wartości początkowej, a na następnym wstawieniu pojawi się naruszenie więzów PK.

0

Próbowałem tego w SQL 2000 jakiś czas temu. Po wartości Integer.MaxValue następna wartość tożsamości to Integer.MinValue. Następnie liczy się tak, jak można się spodziewać. Dopóki zapisy, które kiedyś istniały w 1,2,3 itd., Zniknęły, zanim dotrą na miejsce, nic złego się nie wydarzy. Jeśli wystąpi duplikat (a pole jest kluczem podstawowym), to wstawianie kończy się niepowodzeniem z naruszeniem klucza. Nie próbowałem jeszcze kolumny tożsamości, która nie jest ograniczona do wartości unikatowych. Sądzę, że byłby zadowolony z duplikatów.

0

Generalnie pojawia się błąd. Użyj BIGINT, jeśli jesteś paranoikiem.

Powiązane problemy