如何在SQLite中逻辑删除记录

时间:2013-09-08 18:42:24

标签: sql sqlite triggers sqlitejdbc

我想将记录标记为已删除而不是实际删除记录。 我的意图是使用而不是触发器,但我得到一个SQLException,我和谷歌都不知道如何解决这个问题。

我的代码:

    CREATE TRIGGER IF NOT EXISTS <Trigger>
           INSTEAD OF DELETE ON <Table>
            FOR EACH ROW
            BEGIN
              UPDATE <Table>
              SET Status = 'D'
              WHERE ID = old.ID;                
            END

我的错误:

java.sql.SQLException: cannot create INSTEAD OF trigger on table: main.<Table>
    at org.sqlite.NativeDB.throwex(NativeDB.java:210)
    at org.sqlite.NativeDB._exec(Native Method)
    at org.sqlite.Stmt.executeUpdate(Stmt.java:152)

请帮助我?

修改 我真正想要的是激活外键实施。

请参阅此处:How do you enforce foreign key constraints in SQLite through Java?

2 个答案:

答案 0 :(得分:2)

您不能在表上使用INSTEAD OF触发器,并且RAISEBEFORE / AFTER触发器中发生错误时,触发器中执行的所有更新也将被滚动回来。

您可以重命名您的表格,为该表格创建一个视图,并创建大量INSTEAD OF触发器来实施所有INSERT / UPDATE / DELETE操作。< / p>

但是,当您想要标记某些记录时,将程序更改为仅执行UPDATE会更容易。

答案 1 :(得分:1)

而不是触发器旨在与视图一起使用,以便您可以指定在插入时应执行操作的基础表,更新我们的删除是在视图本身上发布的。

您可以尝试的一件事是在删除触发器之前执行,然后引发异常。唯一的问题是我不确定这是否也会干扰更新。也许值得一试:

SELECT RAISE(ABORT, 'Prevent delete');