1

我想将记录标记为已删除,而不是实际删除记录。我的意图是使用一个而不是触发器,但我得到一个 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)

请帮帮我好吗?

编辑: 我真正想要的是激活外键执行。

请参阅此处:如何通过 Java 在 SQLite 中强制执行外键约束?

4

2 回答 2

2

您不能INSTEAD OF在表上使用触发器,并且当/触发器中RAISE出现错误时,触发器中完成的任何更新也将被回滚。BEFOREAFTER

您可以重命名您的表,为该表创建一个视图,并创建许多INSTEAD OF触发器来实现所有INSERT//操作UPDATEDELETE

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

于 2013-09-09T07:04:56.607 回答
1

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

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

SELECT RAISE(ABORT, 'Prevent delete');
于 2013-09-08T20:31:40.067 回答