gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:40:20 25 4
gpt4 key购买 nike

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

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com