mySql - Как искать доступные идентификаторы - PullRequest
0 голосов
/ 19 марта 2020

У меня есть таблица mySQL, которая хранит данные списка пользователей и имеет идентификатор в формате unsigned tiny-int (возможно от 0 до 255 записей) в качестве первичного ключа. Я включил автоинкремент, чтобы автоматически установить ключ, который до сих пор работал нормально.

Когда пользователи выходят из системы, я вызываю ALTER TABLE sj_userlist AUTO_INCREMENT=1, который выполняется без ошибок.

Однако, следующий зарегистрирован пользователь по-прежнему получает идентификатор + 1 самого высокого на данный момент идентификатора.

Пример:

  1. 10 Пользователи в сети с идентификаторами 1,2,3,4,5,6, 7,8,9,10
  2. Пользователи 1 и 2-9 выходят из системы - только ID 1 и 10 все еще входят в систему
  3. новый пользователь входит в систему и получает ID 11, но я хочу его / ей, чтобы получить 2

Если это поведение правильное, как я могу найти альтернативное решение, которое всегда начинается с 1, увеличиваясь, пока не будет найден следующий доступный идентификатор?

Заранее спасибо, лучше всего

Алекс

1 Ответ

0 голосов
/ 19 марта 2020

Возможное решение.

  1. Создать таблицу для регистрации пользователей. Определите столбец имени пользователя как уникальный.
  2. Вставьте в него максимальное количество записей в соответствии с типом данных (например, 0-255).
  3. Когда пользователь входит в систему и должен зарегистрироваться, вы используете
UPDATE table
SET name = 'Current user name'
WHERE name IS NULL
ORDER BY id
LIMIT 1;

SELECT id
FROM table 
WHERE name = 'Current user name';

Это гарантия того, что пользователь получит наименьший доступный номер и проблем с помехами / совпадениями не возникнет.

Когда пользователь выходит из системы, вы используете
UPDATE table
SET name = NULL
WHERE name = 'Current user name'

id теперь свободен для повторного использования следующим пользователем, вошедшим в систему.

При возникновении некоторых проблем клиентская сторона и пользователь не вышли из системы, тогда его имя останется зарегистрированным. Но когда он войдет в систему в следующий раз, он получит тот же id - ОБНОВЛЕНИЕ не удастся, но SELECT вернет несвободное id.

Тем не менее, вы должны периодически очищать такие старые записи.

...