5

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

  1. 有三个表 - 零售商店、批发商店和产品
  2. 表retail_store 和批发商店有来自表product 的列product_id

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

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

感谢您考虑这个。干杯!

4

3 回答 3

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 ;
于 2012-05-24T16:49:13.573 回答
1

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

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

NO ACTION:配置“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

于 2012-05-24T16:21:42.430 回答
-1

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

PRAGMA foreign_keys = ON;
于 2017-02-20T21:21:44.000 回答