PDA

Просмотр полной версии : [Вопрос] MySQL и запись нового аккаунта



Paradox
02.07.2018, 16:45
Доброе время суток.
В общем у меня возник такой вопрос.
К примеру есть у нас 10 аккаунтов иды которых 1..10.
Один из аккаунтов был удален, остались аккаунты к примеру 1..7, 9, 10
Можно ли как-то сделать что бы запись нового аккаунта была на пропущенный ID?
Если можно пример кода, буду очень благодарен.

Daniel_Cortez
02.07.2018, 18:01
Во-первых, зачем вам это? Боитесь, что впустую израсходуются все возможные ID в 32-битном диапазоне (а это 4 294 967 296 значений)?
Во-вторых, если речь о MySQL, то там "из коробки" такой возможности нет (по крайней мере, я не видел ни разу).
В-третьих, даже если бы такая возможность и была, она б требовала лишних затрат на поиск наименьшего незанятого ID. Даже с кешированием вроде запоминания наименьшего свободного ID при удалении эти затраты могут быть существенными при большом количестве аккаунтов.

whale
02.07.2018, 19:50
http://pro-pawn.ru/showthread.php?14722-%D0%9F%D0%BE%D0%B8%D1%81%D0%BA-%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%B3%D0%BE-%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0-GetFreeTableNumber&highlight=GetFreeTableNumber

Paradox
02.07.2018, 19:50
Во-первых, зачем вам это? Боитесь, что впустую израсходуются все возможные ID в 32-битном диапазоне (а это 4 294 967 296 значений)?
Во-вторых, если речь о MySQL, то там "из коробки" такой возможности нет (по крайней мере, я не видел ни разу).
В-третьих, даже если бы такая возможность и была, она б требовала лишних затрат на поиск наименьшего незанятого ID. Даже с кешированием вроде запоминания наименьшего свободного ID при удалении эти затраты могут быть существенными при большом количестве аккаунтов.

Не знаю, просто интересно стало, дело в том что сама ID length = 3, что будет если предпоследний аккаунт будет 999, то последний вообще не запишет или как?
И да, я в курсе что значение length можно увеличить, просто мне стало интересно.

whale
02.07.2018, 20:17
Не знаю, просто интересно стало, дело в том что сама ID length = 3, что будет если предпоследний аккаунт будет 999, то последний вообще не запишет или как?
И да, я в курсе что значение length можно увеличить, просто мне стало интересно.

Выше я тебе предоставил функцию. Но, тем не менее, использовать её для таблицы аккаунтов (которых может быть десятки тысяч, а то и сотни) - довольно плохая затея.

DeimoS
03.07.2018, 18:31
Если тебе нужно иметь столбец с данными, у которых все разрывы будут заполняться (например, для системы домов), то просто создавай ещё один столбец и уже самостоятельно реализуй отслеживание свободных ID (лучше это делать с помощью того же foreach, если все данные с таблицы всегда грузятся на сервер. Функция, что скинули выше, подойдёт только для не очень больших таблиц (ну чем больше строк, тем больше задержка), информация из которых либо вообще не хранится на сервере (нужные данные подгружаются в момент нужды), либо хранится частично, как, например, аккаунты). А столбец с AUTO_INCREMENT оставь для правильного функционирования таблицы + для обращения к данными через запросы.

А нативно это не сделали в MySQL потому что, как уже заметили выше, на это будут уходить дополнительные ресурсы и это будет неоправданно.

- - - Добавлено - - -

И да, нет смысла ограничивать AUTO_INCREMENT столбцы типа INTEGER каким-то значением, отличным от 11. MySQL в любом случае выделит под столбец 4 байта. А указывая "3" ты лишь говоришь MySQL записывать первые 3 символа числа.
Вообще в MySQL практически для всех типов данных, кроме VARCHAR, BLOB и TEXT, всегда выделяется фиксированное количество памяти, независимо от того, какое значение ты укажешь в качестве размера. Сделано это для того, чтоб ты мог в любой момент увеличить/уменьшить размер столбца и, при этом, не происходило дефрагментации. А, собственно, для VARCHAR, BLOB и TEXT количество памяти определяется реальным размером текста в столбце + 1 байт, в котором хранится число, равное размеру строки (вообще всё зависит от кодировки, но для SA-MP это не актуально).
Подробнее об этом написано тут (https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html).

Paradox
05.07.2018, 05:20
Спасибо за ответ, буду знать, мне не то что бы нужно что бы иды шли по порядку, скорее просто хотел знать что будет если указывать length определенное число и если оно будет превышать его.

Paradox
05.07.2018, 17:03
Тему можно закрывать, всех благодарю за ответы.