2008-12-12 12 views
21

Rozważmy prostą tabelę z kolumną automatycznego przyrostu jak ten:Co się stanie, gdy skończy się kolumna z automatycznym inkrementowaniem?

CREATE TABLE foo 
(
    `fooid` bigint unsigned NOT NULL auto_increment, 
    ....snipped.... other columns 
    PRIMARY KEY (`fooid`) 
) 
ENGINE=InnoDB AUTO_INCREMENT=10 

Jak można przeprojektować to tak, że nie uderzył w max typów danych bigint? Niepodpisany zakres wynosi od 0 do 18446744073709551615. Nie wiem, ile czasu zajmie osiągnięcie 18446744073709551615, ale tak jak w przypadku problemu Y2K, chcę być na to gotowy.

Odpowiedz

55

Załóżmy, że wstawiasz jeden wiersz co milisekundę.

18446744073709551615 millseconds = 18446744073709552 sekund = 307445734561826 minut = 5124095576030 godzin = 213503982335 dni = 584.942.417 lat

Więc to nie naprawdę podobny problem Y2K

Można wstawić milionów wierszy na milisekundę i nadal będzie dobrze przez ponad 500 lat.

Innymi słowy: nie martw się o to.

+1

Ok. Nie sądzę, że moja aplikacja potrwa tak długo => 500 lat. – ashitaka

+2

Podobnie, jeśli wstawisz tylko raz na sekundę, Twoja aplikacja będzie działać przez 68 lat z 32-bitową intacją. Zaoszczędź 4-bajty na rekord i użyj 32-bitowego int, jeśli możesz. – jmucchiello

+0

Po drugie. Są rzeczy, które wymagają większej ostrożności przy budowaniu bazy danych. – Tomalak

18

W zależności od używanej wersji SQL mode, MySQL wykonuje jedną z dwóch czynności, gdy wartość kolumny numerycznej AUTO_INCREMENT rośnie poza zakres. W obu przypadkach pojawia się błąd, ale z różnych powodów.

W trybie ścisłym MySQL odrzuca Spośród wartości zakresu, zgłasza błąd nieprawidłowej wartości, a INSERT zawiedzie. W domyślnym trybie nieostrym MySQL zmniejsza wartość do najwyższej dozwolonej dla typu danych i wykonuje INSERT. Ale INSERT zawiedzie, ponieważ atrybut AUTO_INCREMENT spowodował wszystkich możliwych wartości do już stosowanych, a otrzymasz ten błąd (unsigned SMALLINT przykład):

MySQL said: 

#1062 - Duplicate entry '65535' for key 1 

Dla przykładu BIGINT tu wymienić „65535” z 18 kwintillionów, chociaż nie wydaje się prawdopodobne, aby błąd wystąpił kiedykolwiek w produkcyjnej bazie danych.

Ale z TINYINT s i SMALLINT s może się zdarzyć bardzo łatwo, jeśli nie docenisz możliwych wartości klucza (liczba INSERT s) w całym okresie życia aplikacji. Wyobraź sobie, że wprowadzasz zmiany w kodzie i testujesz poprawność wstawiania danych. Nagle Twoja aplikacja przestaje działać z powyższym błędem. Przywracasz zmiany do znanego dobrego kodu, ale błąd nie zniknie ... bardzo frustruje.

2

Nie wiem o MySQL, ale w przypadku Postgresql można określić, czy sekwencja jest CYKLEM/NIE CYKLEM. Jeśli utworzono z opcją CYKL, wróci ona ponownie do 1 (lub min. Wartości) i spowoduje zgłoszenie błędu dla duplikatu klucza.

+2

Niedostępne w MySQL. –

Powiązane problemy