У меня есть столбец с именем id в моей базе данных SQLite, который автоматически увеличивается, первичный ключ, уникальный.
Гарантированно ли результатом следующего запроса будет наименьшее значение id в базе данных, и соответствует ли оно «самой старой» (как в FIFO) строке, которую нужно вставить?
SELECT id FROM table LIMIT 1


Is the result of the following query guaranteed to be the smallest value of id in the database
да. Однако, если таблица пуста или столбец id имеет значение NULL, он также может вернуть NULL.
and does this correspond to the "oldest" (as in a FIFO) row to be inserted?
Нет, гарантии этого нет.
Извините, я забыл упомянуть, что ключ id также НЕ ПУСТОЙ. Не могли бы вы представить случай, когда наименьшее значение id не будет самой «старой» строкой, которую нужно вставить? Прекращается ли автоинкремент и возобновляется ли в конечном итоге с 0?
Что ж, есть много случаев, когда наименьший идентификатор будет самой старой записью, но вам нужно прочитать исходный код всего, что вставляется в эту таблицу, чтобы увидеть, что он делает. Если все ваши вставки используют автоматически увеличивающееся значение, сгенерированное sqlite, то, насколько мне известно, самый низкий идентификатор должен быть самой старой записью. Но ничто не мешает вам удалить строку с id = 1, а затем вставить новую строку с id = 1.
В моем случае я пишу приложение, которое является единственным писателем в базу данных, поэтому я могу контролировать, как все пишется. Я не включил это в вопрос, поэтому в целом вы правы.
SQLite документация довольно явный:
If a SELECT statement that returns more than one row does not have an ORDER BY clause, the order in which the rows are returned is undefined. Or, if a SELECT statement does have an ORDER BY clause, then the list of expressions attached to the ORDER BY determine the order in which rows are returned to the user.
LIMIT применяется после, как ORDER BY, поэтому я не думаю, что это влияет на применение этого утверждения.
Следовательно, если вам нужна первая строка, используйте ORDER BY:
SELECT id
FROM table
ORDER BY id
LIMIT 1;
Обратите внимание, что если id является первичным ключом, это практически не добавит накладных расходов.
Я должен подчеркнуть, что на практике вы, вероятно, получите наименьший идентификатор без ORDER BY. Однако это действительно очень плохая идея - полагаться на поведение, которое прямо противоречит документации.
Документы, похоже, указывают, что в отсутствие предложения order by порядок строк вернулся будет неопределенным. Но если предел равен 1, обязательно ли это означает, что порядок, в котором db анализируется, чтобы вернуть эту 1 строку, не определен?
@AlexEshoo. . . Вы должны предположить, что limit выполняет некую волшебную функцию по возврату строки с наименьшим id, когда запрос без limit не имеет таких гарантий.
пропустите order by и limit и просто используйте min(), если вам нужна первая строка идентификатора.
select min(id) from from table, поскольку AUTOINCREMENT гарантирует только наличие ROWID, которые никогда ранее не использовались той же таблицей в той же базе данных. И монотонно возрастать.