在SQLite中删除触发器后的条件执行

时间:2012-05-24 16:17:19

标签: sqlite

我需要为以下条件准备一个SQLite触发器 -

  1. 有三个表 - retail_store,wholesale_store和product
  2. 表retail_store和wholesale_store具有来自表产品
  3. 的列product_id

    现在我想写一个删除触发器,这样如果产品从retail_store中删除,如果它不在表wholesale_store中,那么应该从产品表中删除该产品记录。

    **我理解,删除这样的产品记录可能不是一个好主意。请将此问题仅作为技术并发症。

    感谢您考虑这个。干杯!

3 个答案:

答案 0 :(得分:9)

也许以下sql语句对您有用,但我无法保证语法正确。

 CREATE TRIGGER after_retail_store_delete after delete ON retail_store
    WHEN ((select count() from  wholesale_store where productid = OLD.id) = 0)
    BEGIN
      DELETE FROM product WHERE productid = OLD.id ;
    END ;

答案 1 :(得分:1)

听起来你实际上并不需要触发器。我会考虑使用级联删除。你在用外键吗?看看这个:

  

与每个外键关联的ON DELETE和ON UPDATE操作   SQLite数据库是“NO ACTION”,“RESTRICT”,“SET NULL”,“SET”之一   DEFAULT“或”CASCADE“。如果未明确指定操作,则为   默认为“NO ACTION”。

     

无操作:配置“无操作”仅表示:当父键时   被修改或从数据库中删除,不采取任何特殊措施。

     

RESTRICT:“RESTRICT”操作意味着应用程序是   禁止删除(对于ON DELETE RESTRICT)或修改(对于ON   UPDATE RESTRICT)存在一个或多个子键时的父键   映射到它。 RESTRICT动作的效果之间的差异   和正常的外键约束执行是RESTRICT   一旦字段更新,就会发生动作处理 - 而不是在   当前声明的结束,因为它会立即受到限制,   或者在当前交易结束时,与延期交易一样   约束。即使附加的外键约束是   延迟,配置RESTRICT操作会导致SQLite返回   如果删除具有从属子键的父键,则立即出错   或修改。

     

SET NULL:如果配置的操作是“SET NULL”,那么当父项时   键被删除(对于ON DELETE SET NULL)或被修改(对于ON UPDATE SET   NULL),子表中所有行的子键列   映射到父键设置为包含SQL NULL值。

     

SET DEFAULT:“SET DEFAULT”操作类似于“SET NULL”,   除了每个子键列都设置为包含   列默认值而不是NULL。请参阅CREATE TABLE   有关如何为表分配默认值的详细信息的文档   列。

     

CASCADE:“CASCADE”操作传播删除或更新操作   在每个从属子键的父键上。对于“ON DELETE   CASCADE“动作,这意味着子表中的每一行都是   与删除的父行关联的也将被删除。对于“ON   UPDATE CASCADE“动作,它表示存储在每个中的值   依赖子键被修改为匹配新的父键值。

在这里阅读更多内容: http://www.sqlite.org/foreignkeys.html#fk_actions

答案 2 :(得分:-1)

您好阅读文档Sqllite Foreing Key使用该SQL命令:

PRAGMA foreign_keys = ON;