LINUX.ORG.RU

MySQL AUTO_INCREMENT вопрос от чайника.

 


0

2

Друзья, задумался над таким вопросом, допустим есть какая-то таблица с автозаполнением поля типа INT, скажем поле ID длинна поля по-умолчанию 11 символов, то есть по факту это 99 999 999 999 записей. Я понимаю, что теоретически заполнить базу таким кол-вом записей не так просто. Но допустим это какой-то высоко нагруженный проект, плюс постоянно идет удаление - добавление записей (ведь при каждом удалении записи число не откатывается назад на один, а продолжается дальше), то у меня возникает вопрос, что будет, когда счетчик придет к цифре 99 999 999 999? Ведь поле ID мало того что уникально (не может повторяться) ещё и AUTO_INCREMENT. Знатоки подскажите неразумному :)

То есть оно пойдет по-кругу? Скажем есть 2 записи, ID будет равно 0 и 1, соответственно, допустим удалили первую запись, и добавили ещё одну, получилось 1 и 2, и т.д., когда дойдет до конца до 99 999 999 999, снова начнет с 0? Я правильно понимаю? Но если так, то допустим заполнится все 99 999 999 999, что будет дальше?



Последнее исправление: yakunin (всего исправлений: 2)

Вселенная сколлапсирует, не иначе. Создай таблицу с auto_incremet, вставь в неё запись с очень большим числом, вставь ещё одну запись, посмотри результат.

WARNING ★★★★
()
Ответ на: комментарий от WARNING

Или повесить auto_incremet на короткое поле

MrClon ★★★★★
()
Ответ на: комментарий от crutch_master

Ну то есть при таком раскладе, скажем есть около 10 000 запросов в секунду, это 600 000 запросов в минуту и 36 000 000 записей в час ну и так далее, то значение очень быстро придет к порогу в 99 999 999 999.

На сайте разработчика (MySQL) пишут что по достижении предела счетчика он будет пытаться заполнить неиспользуемые значения до тех пор пока вся длинна значения не будет заполнена.

Но главное что в конце концов он придет к значению

Duplicate entry '99 999 999 999' for key 'PRIMARY'

yakunin
() автор топика

Int это 4294967295 возможных значений, а размер который выставляется это количество отдаваемых символов.

Если поле с авто инкрементом и должно быть уникальным то при достижении 4294967295 будет выдаваться ошибка о невозможности добавить запись. Если поле не должно быть уникальным то да, просто обнулится и пойдет по второму кругу.

На практике же содержание в одной таблице 4294967295 записей не разумно, но если очень хочется то есть BIGINT на 18446744073709551615 записей.

karaien ★★
()
Последнее исправление: karaien (всего исправлений: 1)
Ответ на: комментарий от karaien

Да, это понятно что можно использовать bigint, но это что-то запредельное. Банально интересовало, именно достижения крайнего значения. Спасибо большое.

yakunin
() автор топика
Ответ на: комментарий от crutch_master

Да,пожалуй соглашусь. ;) Спасибо за ответы.

yakunin
() автор топика

Вообще-то знаковый инт максимальное значение будет 2147483647 и 4294967295 беззнаковый
Само int(11) не имеет абсолютно никакого значения к int и размеру int, оно имеет значение только для отображения

MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits.

К примеру, у мускула есть тип INT UNSIGNED ZEROFILL, а значит если мы укажем INT(5) и сделаем вставку числа 14, то в колонке у нас при выводе будет 00014
Добавлю еще пример для наглядности

mysql> DESCRIBE `h`;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type                     | Null | Key | Default | Extra          |
+-------+--------------------------+------+-----+---------+----------------+
| ih    | int(1)                   | NO   | PRI | NULL    | auto_increment |
| k     | int(5) unsigned zerofill | NO   |     | NULL    |                |
+-------+--------------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM `h`;
+------+-------+                                                                                                             
| ih   | k     |                                                                                                             
+------+-------+                                                                                                             
| 5645 | 00014 |                                                                                                             
+------+-------+                                                                                                             
1 row in set (0.00 sec)                                                                                                      
                                                                                                                             
mysql>

kiotoze ★★★★
()
Последнее исправление: kiotoze (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.