【问题标题】:Sqlite triggered update malfunctionsSqlite 触发更新故障
【发布时间】:2021-01-04 23:11:11
【问题描述】:

我有一张表,需要在插入其中一张表时触发。我已经编写了 2 个触发器,但所需表中的值没有按预期更新。相反,在两列中输入的是相同的值。

const val NEW_TRANSACTION_TRIGGER_NAME = "transaction_insert_trigger"
const val NEW_TRANSACTION_TRIGGER = "create trigger $NEW_TRANSACTION_TRIGGER_NAME " +
    "after insert on transactions " +
    "begin " +
    "update transactions " +
    "set firm_id = (select firm_id from parties where id = new.party_id) " +
    "where id = new.id ; " +
    "end"
const val NEW_TRANSACTION_PARTY_TRIGGER_NAME = "transaction_insert_party_trigger"
const val NEW_TRANSACTION_PARTY_TRIGGER = "create trigger $NEW_TRANSACTION_PARTY_TRIGGER_NAME " +
    "after insert on transactions " +
    "begin " +
    "update transactions " +
    "set party_name = (select party.name from parties party where party.id = new.party_id) " +
    "where id = new.id ; " +
    "end"

从上面的 sn-p 可以看出,我观察到的表名为transactions。在此表中插入任何内容后,我必须从parties 表中查询数据以更新此表本身中的firm_idparty_name,即transactions 表。除了,令我惊讶的是,我看到的只是firm_idparty_name 这两个条目最终具有与firm_id 相同的值。我在 android 上使用 sqlite,因此我不能使用 update-from 子句。我也试过单trigger,但也没有用。期待快速帮助,因为我的释放被搁置。非常感谢您的帮助。

【问题讨论】:

  • 我之前用过的单触发器:create trigger if not exists $NEW_TRANSACTION_TRIGGER_NAME after insert on transactions begin update transactions set firm_id = (select firm_id from parties where id = new.party_id), party_name = (select name from parties where id = new.party_id) where id = new.id ; end
  • 您的第一个触发器更新的是公司 ID 而不是公司名称,单个触发器也是如此。你还有其他的触发器吗?发布一些示例数据,以便我们重现您的问题。
  • 我的错,我要更新的是firm_id。我将用正确的文字更新问题。谢谢!
  • 你能创建一个小提琴:dbfiddle.uk/?rdbms=sqlite_3.27 来重现你的问题吗?
  • 我没试过。你到底需要我在这里做什么?我可以在一点帮助下做到这一点。

标签: android database sqlite triggers


【解决方案1】:

我会将其简化为单个触发器:

CREATE TRIGGER whatever_name
AFTER INSERT ON transactions
BEGIN
 UPDATE transactions
 SET (firm_id, party_name) = (SELECT firm_id, name FROM parties WHERE parties.id = new.party_id)
 WHERE id = new.id;
END;

使用几个快速示例表和行对我有用。

【讨论】:

  • 我想使用它,但我不能,因为 android studio 显示此语法错误。知道哪个 sqlite 版本开始支持这种语法吗?谢谢!
  • 从 SQLite 3.15.0 版本开始
  • 嗯,这就解释了错误。因为 apk 的最低 sdk for android 设置为 16,根据官方文档有 sqlite 版本 3.7.x?
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
相关资源
最近更新 更多