就目前而言,级联外键操作不会激活触发器。MySQL
我不想参与关于这是否好的辩论,我只想知道是否有解决方法。
我目前正在triggers
做这样的事情:
CREATE TRIGGER `Set_field1_on_update` BEFORE UPDATE ON `mytable`
FOR EACH ROW BEGIN
SET NEW.field1 = CONCAT(NEW.myforeignkey,'whatever');
END
myforeignkey
直接更改时效果很好,mytable
但ON UPDATE CASCADE
通过其引用表更新时效果不佳。
无论如何,在级联外键操作上实现上述功能(必要时使用触发器以外的东西)?
解决方法,如果这是正确的词,似乎是
AFTER UPDATE
在父表上的触发器中对子表进行相同的更改,包含与子表上的触发器相同的逻辑BEFORE UPDATE
,包装在测试中仅当父表中的主键实际发生更改时才执行任何操作,这将导致级联更新。如果 parent_table 上的 primary_key 刚刚更改,那么根据定义,在 parent_primary_key 列中具有新值的所有行 child_table必须刚刚通过级联更新进行更新,因为在 parent_table.primary_key 中存在该值之前,不可能有在 child_table.parent_primary_key 中已经存在具有新值的任何行 ...直到刚刚更新父表的 primary_key 之前,这些行不可能存在,因为它们会违反外键的引用约束(引用不存在的值)。
当然,我在这里使用“主键”,而实际上外键可以引用父表的任何超键。
但是,这会让人质疑您首先真正使用级联更新来完成什么,以及级联更新的应用是否构成了合理的设计。您似乎正在从该值派生另一列,并存储该派生列,而这两种做法似乎都不太理想。
通常,级联更新,至少在原则上,如果实际上不是,似乎不是对数据的更改,就像直接更改子表的更新一样。“这些”子记录引用父表中的“那个”行。在级联更新之后,它们仍然如此,并且没有任何改变,只是密钥不同。