我需要为以下条件准备一个SQLite触发器 -
现在我想写一个删除触发器,这样如果产品从retail_store中删除,如果它不在表wholesale_store中,那么应该从产品表中删除该产品记录。
**我理解,删除这样的产品记录可能不是一个好主意。请将此问题仅作为技术并发症。
感谢您考虑这个。干杯!
答案 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;