2015-05-28 3 views
1

Я реорганизовал таблицу, которая хранила как метаданные, так и данные в две таблицы: одну для метаданных и одну для данных. Это позволяет эффективно запрашивать метаданные.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 тем, как я сначала кодировал его проблематично?

ответ

1

The documentation говорит:

Никакие изменения не могут быть внесены в базу данных, за исключением в рамках транзакции. Любая команда, которая изменяет базу данных (в основном, любая команда SQL, отличная от SELECT), автоматически запустит транзакцию, если она еще не действует.

Команды в триггерах считаются частью команды, которая запускает триггер. Таким образом, все команды в триггере являются частью транзакции и являются атомарными.

Просмотры не имеется (использовано) rowid.

+0

Спасибо. Существует ли какая-либо официальная документация относительно rowid в контексте представления? – bright

+0

Как вы уже упоминали в вопросе, нет никакого «rowid», который можно было бы использовать в представлении. Этот SQLite позволяет получить доступ к этому столбцу, это ошибка, но она поддерживается для обратной совместимости. –