【问题标题】:How to Logically DELETE a record in SQLite如何在 SQLite 中逻辑删除记录
【发布时间】:2013-09-12 07:07:54
【问题描述】:

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

请帮帮我?

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

参考这里:How do you enforce foreign key constraints in SQLite through Java?

【问题讨论】:

  • 我认为触发器只适用于视图
  • 我不是最好的 SQLite,但是否应该声明“旧”?像“INSTEAD OF DELETE ON ”之类的?
  • sry,不是 OLD 是正确的,请忽略我的评论
  • @Danis 在“Instead of Trigger”标题下link...触发器可以在视图上创建,也可以在普通表上...

标签: sql sqlite triggers sqlitejdbc


【解决方案1】:

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

您可以重命名表,为该表创建视图,并创建大量 INSTEAD OF 触发器来实现所有 INSERT/UPDATE/DELETE 操作。

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

【讨论】:

  • 感谢 CL 和 @ChrisProsser,我决定创建一个删除前触发器来“防止删除”,然后使用正常的 UPDATE 语句进行标记。将考虑编写一个程序来锁定表,删除触发器,“真正”删除不相关的记录,然后重新附加触发器。
【解决方案2】:

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

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

SELECT RAISE(ABORT, 'Prevent delete');

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多