PostgreSQL中为何UPDATE CASCADE未像DELETE那样级联更新子记录?
问题原因及解决方案
为什么ON UPDATE CASCADE没生效?
你误解了ON UPDATE CASCADE的作用:它只在父记录的主键(这里是comment_id)被修改时,自动将子记录的外键字段(parent_id)同步更新为新的主键值。而你的UPDATE语句修改的是date_deleted字段,不是主键comment_id,所以外键的级联更新规则根本不会触发。
如何实现软删除的级联更新?
要实现父记录软删除时自动更新子记录的date_deleted,需要用**触发器(Trigger)**来实现,具体步骤如下:
- 创建触发器函数:
CREATE OR REPLACE FUNCTION cascade_soft_delete_comments() RETURNS TRIGGER AS $$ BEGIN -- 当父记录的date_deleted从空变为非空时,同步更新所有子记录的date_deleted IF OLD.date_deleted IS NULL AND NEW.date_deleted IS NOT NULL THEN UPDATE comments SET date_deleted = NEW.date_deleted WHERE parent_id = NEW.comment_id; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
- 给comments表绑定触发器:
CREATE TRIGGER trigger_cascade_soft_delete_comments AFTER UPDATE OF date_deleted ON comments FOR EACH ROW EXECUTE FUNCTION cascade_soft_delete_comments();
补充说明
你之前的DELETE操作能级联删除子记录,是因为ON DELETE CASCADE的作用是当父记录被删除时,自动删除所有关联的子记录,这和ON UPDATE CASCADE的触发条件完全不同——前者触发于DELETE操作,后者只触发于主键字段的UPDATE操作。
内容的提问来源于stack exchange,提问作者RobertW
相关产品推荐
相关产品推荐

