如何在SQLite中逻辑删除记录

如何在SQLite中逻辑删除记录,sql,sqlite,triggers,sqlitejdbc,Sql,Sqlite,Triggers,Sqlitejdbc,我想将记录标记为已删除,而不是实际删除记录。 我的意图是使用一个代替触发器,但我得到了一个SQLException,我和Google都不知道如何解决这个问题 我的代码: CREATE TRIGGER IF NOT EXISTS <Trigger> INSTEAD OF DELETE ON <Table> FOR EACH ROW BEGIN UPDATE <Ta

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

我的代码:

    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)
如果不存在,则创建触发器
而不是在
每行
开始
更新
设置状态='D'
其中ID=old.ID;
结束
我的错误:

    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.sql.SQLException:无法在表main上创建替代触发器。
位于org.sqlite.NativeDB.throwex(NativeDB.java:210)
位于org.sqlite.NativeDB.\u exec(本机方法)
位于org.sqlite.Stmt.executeUpdate(Stmt.java:152)
请帮帮我?

编辑: 我真正想要的是激活外键强制


请参阅此处:

替代触发器用于视图,以便您可以指定在对视图本身发出insert、update和delete命令时应执行操作的基础表

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

SELECT RAISE(ABORT, 'Prevent delete');

不能在表上使用
而不是
触发器,并且当
触发器之前的
中引发
/
之后的
中出现错误时,触发器中执行的任何更新也将回滚

您可以重命名表,为该表创建视图,并创建大量
而不是
触发器,以实现所有
插入
/
更新
/
删除
操作


但是,当程序想要标记某个记录时,将其更改为只执行
更新
会容易得多。

我认为触发器只适用于Views,而不是SQLite的最佳触发器,但是否应该声明为“old”?像“而不是删除”之类的吗?sry,它不老是正确的,忽略我的评论please@Danis在标题“代替触发器”下…可以在视图和普通表上创建触发器…感谢CL和@ChrisProsser,我决定创建一个Before Delete触发器来“阻止删除”然后用普通UPDATE语句进行标记。会考虑编写一个程序来锁定表,删除触发器,“真”删除无关的记录,然后重新连接触发器。