如何在SQLite中逻辑删除记录
我想将记录标记为已删除,而不是实际删除记录。 我的意图是使用一个代替触发器,但我得到了一个SQLException,我和Google都不知道如何解决这个问题 我的代码:如何在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
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语句进行标记。会考虑编写一个程序来锁定表,删除触发器,“真”删除无关的记录,然后重新连接触发器。