Обновление SQLite при выборе (или наоборот) - PullRequest
1 голос
/ 07 сентября 2010

Есть ли в SQLite метод выбора и обновления (или обновления и выбора) с одним оператором?

Триггер может вызывать select, но это не позволяет использовать обновление ввыражение:

CREATE TABLE id ( a integer );
CREATE TRIGGER idTrig AFTER UPDATE ON id BEGIN SELECT old.a FROM id; END;
INSERT INTO id VALUES ( 100 );
INSERT INTO test VALUES ( (UPDATE id SET a=a+1) ); -- syntax error

(Доступен ли сработавший выбор только через C API?)

Я генерирую идентификаторы объектов для нескольких баз данных из одной базы данных идентификаторов (с одной строкой для следующегодоступный идентификатор).Я хотел бы выбрать и обновить идентификатор БД в одном операторе, чтобы у параллельных соединений БД, которые присоединяют БД идентификатора, не возникало проблем с этим (когда два подключения можно было вставить перед любым обновлением):

INSERT INTO tab VALUES ( (SELECT uuid||oid AS oid FROM id.tab), ... );
UPDATE id.tab SET oid = oid+1;

Ответы [ 2 ]

0 голосов
/ 09 сентября 2010

В этом обсуждении представлены два возможных решения:

http://www.mail-archive.com/sqlite-users@sqlite.org/msg10705.html

0 голосов
/ 07 сентября 2010

Я начну с обязательного требования: почему бы не использовать GUID?Они не требуют централизованного управления и, следовательно, более эффективны и с ними легче работать.

Если вам действительно нужно центральное хранилище идентификаторов, вы можете сделать идентификатор автоинкрементным и получить его с помощью SELECT last_insert_rowid().Если вам нужно сгенерировать свои собственные идентификаторы, то сделайте столбец идентификаторов первичным ключом, чтобы вы могли сгенерировать идентификатор, INSERT it и повторить попытку в случае сбоя INSERT.

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