Co się stanie, gdy automatyczny przyrost liczby całkowitej osiągnie maksymalną wartość w bazach danych?

Wdrażam aplikację bazodanową i będę używał zarówno JavaDB jak i MySQL jako bazy danych. Mam kolumnę ID w moich tabelach, która ma integer jako typ i używam bazy danych auto_increment-funkcja dla wartości.

Ale co się stanie, gdy dostanę więcej niż 2 (lub 4) miliardy postów i liczba całkowita nie wystarczy? Czy liczba całkowita jest przepełniona i kontynuowana, czy jest wyrzucony wyjątek, z którym mogę sobie poradzić?

Tak, Mogę zmienić na long as datatype, ale jak sprawdzić, kiedy jest to potrzebne? I myślę, że jest problem z uzyskaniem funkcji last_inserted_id()-Jeśli używam long jako datatype dla kolumny ID.

Author: Jonas, 2010-04-11

6 answers

Komentarz Jima Martina z §3.6.9. "Using AUTO_INCREMENT" of the MySQL documentation:

Na wszelki wypadek, pole AUTO_INCREMENT /nie zawija/. Po osiągnięciu limitu rozmiaru pola Wstawki generują błąd. (Wg Jeremy 'ego Cole' a)

Szybki test z MySQL 5.1.45 powoduje błąd:

Nie udało się odczytać wartości auto-przyrostu z silnika pamięci

Możesz to sprawdzić błąd na wstawić i podjąć odpowiednie działania.

 42
Author: outis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-11 00:21:25

Aby uspokoić nerwy, rozważ to:

Załóżmy, że masz bazę danych, która wstawia nową wartość za każdym razem, gdy użytkownik wykonuje jakąś transakcję na twojej stronie.

Z 64-bitową liczbą całkowitą jako ID wtedy jest to warunek przepełnienia: Przy światowej populacji 6 miliardów, jeśli każdy człowiek na ziemi wykonuje transakcję raz na sekundę każdego dnia i każdego roku (bez odpoczynku), to zajmie więcej niż 80 lat, aby Twój Identyfikator owijał się wokół.

Ie, tylko google musi niejasno rozważyć ten problem od czasu do czasu podczas przerwy na kawę.

 41
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-16 09:26:33

Będziesz wiedział, kiedy się przepełni, patrząc na największy identyfikator. Powinieneś to dobrze zmienić, zanim jakikolwiek wyjątek zbliży się do wyrzucenia.

W rzeczywistości powinieneś projektować z wystarczająco dużym typem danych, aby zacząć. Wydajność twojej bazy danych nie ucierpi, nawet jeśli Od początku używasz 64-bitowego identyfikatora.

 8
Author: Matti Virkkunen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-10 23:42:14

Odpowiedzi tutaj mówią, co się dzieje, ale tylko jedna odpowiedź mówi, jak wykryć problem(i dopiero po wystąpieniu błędu). Ogólnie rzecz biorąc, pomocne jest wykrywanie tych rzeczy, zanim staną się problemem produkcyjnym, więc napisałem zapytanie, aby wykryć, gdy nastąpi przepełnienie: {]}

SELECT
  c.TABLE_CATALOG,
  c.TABLE_SCHEMA,
  c.TABLE_NAME,
  c.COLUMN_NAME
FROM information_schema.COLUMNS AS c
JOIN information_schema.TABLES AS t USING (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME)
WHERE c.EXTRA LIKE '%auto_increment%'
  AND t.AUTO_INCREMENT / CASE c.DATA_TYPE
      WHEN 'TINYINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 255, 127)
      WHEN 'SMALLINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 65535, 32767)
      WHEN 'MEDIUMINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 16777215, 8388607)
      WHEN 'INT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 4294967295, 2147483647)
      WHEN 'BIGINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', '18446744073709551615', 9223372036854775807) # need to quote because column type defaults to unsigned.
      ELSE 0
    END > .9; # 10% buffer
Mam nadzieję, że to komuś pomoże.
 4
Author: CSTobey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 16:00:22

Dla MySQL 5.6, 3.6.9 Using AUTO_INCREMENT in says:

Użyj najmniejszego typu danych integer dla kolumny AUTO_INCREMENT, która jest wystarczająco duża, aby pomieścić maksymalną wartość sekwencji, jakiej potrzebujesz. Gdy kolumna osiągnie górną granicę typu danych, następna próba wygenerowania numeru sekwencyjnego nie powiedzie się.

 0
Author: Jingguo Yao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 08:29:22

Chciałbym podzielić się osobistym doświadczeniem, które właśnie miałem na ten temat. Używanie Nagios + Check_MK + NDOUtils. Ndoutils przechowuje wszystkie kontrole w tabeli o nazwie nagios_servicechecks. Klucz podstawowy to AUTO_INCREMENT int signed. Co się dzieje z MySQL, gdy ten limit jest wahany? Cóż, w moim przypadku MySQL usuwa wszystkie rekordy, ale ostatni. Stół jest teraz prawie pusty. Za każdym razem, gdy wstawiany jest nowy rekord, stary jest usuwany. Nie dlaczego tak się dzieje, ale faktem jest, że straciłem wszystkie moje records. IDOUtils, używane z Icinga (nie Nagios), Naprawiono ten problem zmieniając int przez bigint. Nie generował błędu.

 0
Author: Samuel Casimiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 18:33:53