Приведенный выше ответ (от Адриана Карнейру) является фантастическим и работает, если в таблице не используется другое поле в качестве первичного ключа и НЕ имеется ключа для «id».
Имеется таблица с первичным ключом ID пользователя: -
MariaDB [unixua]> select userid, uid from accounts;
+---------+----------+
| userid | uid |
+---------+----------+
| acc0001 | 89814678 |
| acc0002 | 38000474 |
| acc0005 | 38000475 |
| acc0017 | 38000478 |
+---------+----------+
4 rows in set (0.00 sec)
Мы ожидаем, что самый низкий бесплатный номер будет 38000476.
MariaDB [unixua]> SELECT t1.uid +1 FROM accounts t1
LEFT JOIN accounts t2 ON (t1.uid +1 = t2.uid)
WHERE t2.uid IS NULL AND t1.uid>38000474 LIMIT 1;
+-----------+
| t1.uid +1 |
+-----------+
| 89814679 |
+-----------+
1 row in set (0.00 sec)
Но, поскольку MySQL / MariaDB выбирает их в порядке первичного ключа, это дает сбой и дает следующий наивысший после "acc001".
Добавляя ключ к столбцу uid и выполняя только SELECT для столбца «uid», MySQL / MariaDB будет использовать индекс для извлечения данных (вместо чтения таблицы). Поскольку индекс «упорядочен», результат будет другим: -
MariaDB [unixua]> alter table accounts add unique index (uid);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [unixua]> SELECT t1.uid +1 FROM accounts t1
LEFT JOIN accounts t2 ON (t1.uid +1 = t2.uid)
WHERE t2.uid IS NULL AND t1.uid>38000474 LIMIT 1;
+-----------+
| t1.uid +1 |
+-----------+
| 38000476 |
+-----------+
1 row in set (0.00 sec)
Убедитесь, что в вашей таблице есть ключ для поля Идентификатор клиента (и это поле Идентификатор клиента является числовым).
Это работает, потому что оптимизатор может извлекать все необходимые данные для выбора из индекса (aka accounts.myi, а не accounts.myd), а не данные таблицы.