我重构了一个将元数据和数据都存储到两个表中的表,一个用于元数据,另一个用于数据。这允许有效地查询元数据。
我还使用 sqlite 的插入、更新和删除触发器创建了一个包含原始表列的可更新 View 。这允许调用需要数据和元数据保持不变的代码。
插入和更新触发器将每个传入的行写入两行 - 一个在元数据表中,一个在数据表中,如下所示:
// 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;
问题:
WHERE rowid=old.rowid
但这似乎会导致随机问题,所以我将它们更改为 WHERE Id=old.Id
.原始版本基于我找到的教程代码。但是在考虑之后,我想知道 sqlite 是如何产生一个旧的 rowid 的——毕竟,这是一个跨多个表的 View 。 sqlite 将什么 rowid 传递给更新触发器,WHERE 子句是我第一次编写它的方式有问题吗? 最佳答案
No changes can be made to the database except within a transaction. Any command that changes the database (basically, any SQL command other than SELECT) will automatically start a transaction if one is not already in effect.
触发器中的命令被认为是触发触发器的命令的一部分。
所以触发器中的所有命令都是事务的一部分,并且是原子的。
View 没有(可用的)
rowid
.
关于Sqlite:插入触发器中对两个表的更新是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511116/