SQLite: Как получить последнюю запись? - PullRequest
0 голосов
/ 20 января 2019

У меня есть база данных SQLite и я хочу получить последнюю запись.

Я знаю о ORDER BY column DESC LIMIT 1. Однако причина, по которой это не достаточно хорошо, заключается в том, что в этой базе данных A) нет индексов, и я не хочу их создавать, и первичный ключ тоже не достаточно велик, подумайте о строках порядка 1 млрд.

CREATE TABLE my_table (
    col1 TEXT,
    col2 float,
   )

Теперь строки находятся на физическом диске в том же порядке, в котором они были вставлены, поэтому получение последней должно быть тривиальным. Я полагаю, что этот порядок в MySQL будет соответствовать первичному ключу, который всегда должен присутствовать в MySQL, поэтому я мог бы использовать решение ORDER BY primary_key DESC LIMIT 1. Но здесь я не знаю, что делать, потому что, насколько я могу судить, первичного ключа, соответствующего порядку диска, нет.

Я выполнил SELECT COUNT(*) FROM my_table; (для выполнения которого требуется 15 минут), и поэтому я знаю точное количество строк в таблице, назовем его N. Если бы у меня был AUTOINCREMENT PRIMARY KEY, я мог бы сделать WHERE primary_key > N-1, но опять же, это, кажется, отсутствует.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

У вас всегда есть индекс, если вы не укажете БЕЗ ROWID, то есть есть скрытый столбец с именем rowid (AUTOINCREMENT, который может быть закодирован, только если указан INTEGER PRIMARY KEY) (INTEGER PRIMARY KEY определяет столбец как псевдоним rowid ) (AUTOINCREMENT налагает ограничение на то, что значение, генерируемое SQLite, выше, чем любое существующее).

Вы можете попытаться использовать ORDER по rowid, НО без AUTOINCREMENT нет гарантии, что самый высокий rowid будет последней строкой (но пока вы не нажмете 9223372036854775807 строк, она должна быть (при условии, что вы не ' не связывайтесь с шумом)).

С AUTOINCREMENT у вас есть дополнительные накладные расходы, особенно при вставке, поскольку он не только должен извлечь самый высокий идентификатор строки (к которому обычно добавляется 1), но также должен извлечь соответствующую строку из таблицы sqlite_sequence. Автоинкремент SQLite

0 голосов
/ 20 января 2019

используя этот код:

select * from my_table order by rowid desc LIMIT 1

rowid - встроенное поле в sqlite таблицах Подробнее: https://www.sqlite.org/lang_createtable.html#rowid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...