Postgresql 通过级联删除子记录时,如何使父记录数据可用
考虑以下两个表:Postgresql 通过级联删除子记录时,如何使父记录数据可用,postgresql,triggers,Postgresql,Triggers,考虑以下两个表: CREATE TABLE public.parent ( id bigint NOT NULL DEFAULT nextval('parent_id_seq'::regclass), CONSTRAINT pk_parent PRIMARY KEY (id) ); CREATE TABLE public.child ( child_id bigint NOT NULL DEFAULT nextval('child_child_id_seq'::regclass),
CREATE TABLE public.parent
(
id bigint NOT NULL DEFAULT nextval('parent_id_seq'::regclass),
CONSTRAINT pk_parent PRIMARY KEY (id)
);
CREATE TABLE public.child
(
child_id bigint NOT NULL DEFAULT nextval('child_child_id_seq'::regclass),
parent_id bigint NOT NULL,
CONSTRAINT pk_child PRIMARY KEY (child_id),
CONSTRAINT inx_parent FOREIGN KEY (parent_id)
REFERENCES public.parent (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE INDEX fki_child
ON public.child
USING btree
(parent_id);
CREATE TRIGGER child_trg
BEFORE DELETE
ON public.child
FOR EACH ROW
EXECUTE PROCEDURE public.trg();
而trg
的定义如下:
CREATE OR REPLACE FUNCTION public.trg()
RETURNS trigger AS
$BODY$BEGIN
INSERT INTO temp
SELECT p.id
FROM parent p
WHERE
p.id = OLD.parent_id;
return OLD;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
为了总结正在发生的事情,有两个表具有简单的父子关系和级联关系。还有一个触发器定义在监听删除的孩子身上。我需要访问触发器中的父数据,当子记录由于父子关系上的级联而被删除时。但是我不能,因为它们已经被删除了!有人知道怎么做吗?一个解决方案是在删除之前在父级上创建一个
触发器,它可以查看所有数据
几乎正确,您需要编写两个触发器,一个用于父触发器,一个用于子触发器,以防直接删除子触发器。谢谢。@Mehran:您说过由于父子关系的级联,孩子的记录被删除了。您提到的附加触发器似乎不在这个问题的范围内。您是对的,但这是因为在我的原始问题中不存在这样的问题,它是在您将触发器移动到父表后引入的。我并不是说你的答案是错误的,只是在我的情况下,我不得不写两个来补偿直接删除。无论如何,谢谢你。
CREATE OR REPLACE FUNCTION public.trg_parent()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO some_tbl (id) -- use target list !!
VALUES (OLD.parent_id);
RETURN OLD;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER parent_trg
BEFORE DELETE ON public.parent
FOR EACH ROW EXECUTE PROCEDURE public.trg_parent();