Как я могу использовать последовательности в SQLite? - PullRequest
7 голосов
/ 19 декабря 2010

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

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

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

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

update foo set value=value+1;

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

3 голосов
/ 21 декабря 2010

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

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