Как я могу использовать последовательности в 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 реализует параллелизм с блокировкой базы данных, поэтому второй писатель будет блокировать в любом случае (не только из-за обновления последовательности, но и из-за другого изменения, которые он хочет внести).