Sqlite:插入触发器中对两个表的更新是原子的吗?

标签 sqlite view triggers atomic rowid

我重构了一个将元数据和数据都存储到两个表中的表,一个用于元数据,另一个用于数据。这允许有效地查询元数据。

我还使用 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;

问题:
  • ItemMetadata 和 ItemData 表的更新是原子的吗?读者是否有可能在第二次更新完成之前看到第一次更新的结果?
  • 最初我的 WHERE 子句是 WHERE rowid=old.rowid但这似乎会导致随机问题,所以我将它们更改为 WHERE Id=old.Id .原始版本基于我找到的教程代码。但是在考虑之后,我想知道 sqlite 是如何产生一个旧的 rowid 的——毕竟,这是一个跨多个表的 View 。 sqlite 将什么 rowid 传递给更新触发器,WHERE 子句是我第一次编写它的方式有问题吗?
  • 最佳答案

    documentation说:

    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/

    相关文章:

    mysql - 将远程位置 B 到 L 的数据库中的相似数据集中到位置 A 的数据库中

    mysql - SQL触发器导致错误

    java - 如何根据未知列数创建动态sql字符串

    android - 如何根据滚动方向折叠/展开 View ?

    c# - 类似但不完全相同的元素的 MVC 部分 View

    ios - Xcode 在本地通知后显示特定 View

    java - 如何使用触发器事件(插入/更新)在sql server 2008中使用jdbc调用java方法?

    Android:在数据库中存储对图像的不变引用

    sqlite - 如何在phonegap应用程序中存储翻译并保存用户首选项?

    javascript - 找不到 Sequelize n :m relation tables