我需要为以下条件准备一个 SQLite 触发器 -
- 有三个表 - 零售商店、批发商店和产品
- 表retail_store 和批发商店有来自表product 的列product_id
现在我想编写一个删除触发器,这样如果一个产品从retail_store 中删除并且它不在表批发商店中,那么应该从产品表中删除该产品记录。
** 我理解作为一种做法,删除这样的产品记录可能不是一个好主意。请将此问题仅视为技术问题。
感谢您考虑这个。干杯!
我需要为以下条件准备一个 SQLite 触发器 -
现在我想编写一个删除触发器,这样如果一个产品从retail_store 中删除并且它不在表批发商店中,那么应该从产品表中删除该产品记录。
** 我理解作为一种做法,删除这样的产品记录可能不是一个好主意。请将此问题仅视为技术问题。
感谢您考虑这个。干杯!
也许下面的 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 ;
听起来你实际上不需要触发器。我会考虑使用级联删除。你在使用外键吗?看一下这个:
与 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”操作,这意味着存储在每个依赖子键中的值被修改以匹配新的父键值。
您好阅读文档Sqllite Foreing Key使用该 SQL 命令:
PRAGMA foreign_keys = ON;