Как я могу использовать последовательности в SQLite?

Я пишу веб-приложение на основе PHP, которое должно работать с несколькими системами баз данных. Наиболее важными являются MySQL и SQLite, но PostgreSQL и другие также были бы хорошими. Для этого я стараюсь использовать как можно более портативный SQL. Там, где это невозможно, я определил некоторые мета-слова в своих запросах, которые обрабатываются моим уровнем БД и преобразуются в команды SQL для конкретной платформы.

теперь я пытаюсь добавить поддержку последовательностей. Каждая СУБД обрабатывает последовательности по-разному, там нет распространенного способа записать их в SQL. Я прочитал и понял как PostgreSQL делает это. Я нашел интересный решение для MySQL который использует таблицы MyISAM, чтобы избежать ограничений изоляции транзакции. В конце концов, последовательности не откатываются с транзакцией, в которой они используются, и это именно то, что я хочу. Последовательности должны быть многопользовательскими.

теперь я не нашел решения для SQLite. Ему не хватает встроенной последовательности поддержка. Он не предоставляет способов хранения данных вне текущей транзакции. Моя текущая реализация-заблокировать таблицу достаточно далеко, чтобы сделать SELECT MAX(...) и использовать это значение. Но я хочу избавиться от этого полностью. В SQLite, этот подход требует блокировки всей базы данных!

кто-нибудь знает решение для этого с SQLite?

2 ответов


Я бы использовал lastInsertRowID. Это возвращает rowid последних вставленных данных (который равен целочисленному значению первичного ключа этой строки). Тогда вам не понадобится никакой последовательности.


просто создайте обычную таблицу счетчиков. О создании последовательности foo, do

create table foo(value int);
insert into foo(value) values(0);

затем, при запросе следующего значения счетчика, сделайте

update foo set value=value+1;

В то время как это откатывается, когда транзакция прерывается, это и многопользовательский сейф: два пользователя не будут фиксировать один и тот же номер. sqlite реализует параллелизм с блокировкой базы данных, поэтому второй писатель будет блокировать в любом случае (не только из-за обновления последовательности, но и из-за другого изменения, которые он хочет внести).