Я реорганизовал таблицу, которая хранила как метаданные, так и данные в две таблицы: одну для метаданных и одну для данных. Это позволяет эффективно запрашивать метаданные.Sqlite: Обновлены ли две таблицы внутри атома вставки?
Я также создал обновляемый вид с колонками исходной таблицы, используя триггеры ввода, обновления и удаления sqlite. Это позволяет вызывать код, который требует как данных, так и метаданных, оставаться неизменным.
Вставки и обновление триггеров записи каждую входящей строки в два ряда - один в таблице метаданных и один в таблице данных, как это:
// View
CREATE VIEW IF NOT EXISTS Item as select n.Id, n.Title, n.Author, c.Content
FROM ItemMetadata n, ItemData c where n.id = c.Id
// Trigger
CREATE TRIGGER IF NOT EXISTS item_update
INSTEAD OF UPDATE OF id, Title, Author, Content ON Item
BEGIN
UPDATE ItemMetadata
SET Title=NEW.Title, Author=NEW.Author
WHERE Id=old.Id;
UPDATE ItemData SET Content=NEW.Content
WHERE Id=old.Id;
END;
Вопросов:
- является обновлением к элементам ItemMetadata и ItemData атомным? Есть ли вероятность, что читатель сможет увидеть результат первого обновления до завершения второго обновления?
- Первоначально у меня были предложения WHERE
WHERE rowid=old.rowid
, но это, казалось, вызывало случайные проблемы, поэтому я сменил их наWHERE Id=old.Id
. Первоначальная версия была основана на коде, который я нашел. Но, подумав об этом, я задаюсь вопросом, как sqlite даже придумывает старую строку - в конце концов, это представление для нескольких таблиц. Какое значение sqid передает sqlite на триггер обновления, и является ли предложение WHERE тем, как я сначала кодировал его проблематично?
Спасибо. Существует ли какая-либо официальная документация относительно rowid в контексте представления? – bright
Как вы уже упоминали в вопросе, нет никакого «rowid», который можно было бы использовать в представлении. Этот SQLite позволяет получить доступ к этому столбцу, это ошибка, но она поддерживается для обратной совместимости. –