Учитывая, что ваша база данных достаточно мала, правильный ответ таков: не используйте ваши идентификаторы вообще и просто убедитесь, что это первичный ключ с автоинкрементным увеличением.Таблица состоит из тысячи записей, так что вы можете сделать это без каких-либо затрат.
Однако, если у вас есть таблица с несколькими миллионами записей / длиннее id, вы обнаружите, что принятыеответ не закончится в разумное время.
Принятый ответ даст правильное наименьшее из этих значений, поэтому, однако, вы платите цену, не используя столбец с автоинкрементом, илиесли он у вас есть, не используйте столбец автоинкремента в качестве фактического идентификатора, как предполагалось (как я, иначе меня бы здесь не было).Я во власти устаревшего приложения, в котором идентификатор не является фактическим первичным ключом, который используется, а генерируется случайным образом с помощью алгоритма лол без какой-либо веской причины, поэтому мне нужно было заменить его, так как увеличение диапазона столбцаТеперь это чрезвычайно дорогое изменение.
Здесь вычисляется полное соединение между полными значениями t1 и t2, а затем сообщается, каков минимум этих объединений.По сути, вы заботитесь только о первом NULL
t1, который будет найден, независимо от того, является ли он на самом деле наименьшим или нет.
Таким образом, вы бы взяли MIN
и добавили LIMIT
вместо 1.
edit: Поскольку он не является первичным ключом, вам также необходимо проверить, не является ли он нулевым, поскольку поле первичного ключа не может быть нулевым
SELECT t1.ID + 1 AS nextID
FROM tablename t1
LEFT JOIN tablename t2
ON t1.ID + 1 = t2.ID
WHERE t2.ID IS NULL
AND t1.ID IS NOT NULL
LIMIT 1
Это всегда дастВы можете использовать идентификатор, который не всегда будет самым маленьким.