首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres级联删除with trigger

Postgres级联删除with trigger
EN

Stack Overflow用户
提问于 2018-09-21 17:39:46
回答 1查看 1.7K关注 0票数 1

我的数据库结构如下:

代码语言:javascript
复制
table a (
    id     bigint primary key,
    del    timestamp
);
table b (
    id     bigint primary key,
    a_id   bigint references a(id) on delete cascade,
    del    timestamp
);

当从表a中删除一条记录时,我希望在当前时间设置del标志,并在表b中设置相应的标志(但实际上不是从数据库中删除记录)。

为此,我编写了一个触发器:

代码语言:javascript
复制
create or replace function a_delete_trigger()
    returns trigger as
$$
begin
    update a
    set del = now()
    where id = old.id; -- mark row

    return null; -- return null, so that the record is not removed from database
end;
$$
language plpgsql;
create trigger a_delete
    before delete
    on a
    for each row
execute procedure a_delete_trigger();

和表b的触发器

代码语言:javascript
复制
create or replace function b_delete_trigger()
    returns trigger as
$$
begin
    update b
    set del = now()
    where id = old.id;

    return null;
end;
$$
language plpgsql;
create trigger b_delete
    before delete
    on b
    for each row
execute procedure b_delete_trigger();

当我从表a ( delete from a where id = ? )中删除一条记录时,该记录被标记为deleted (标志del包含时间戳),但是表b中的相应记录没有被标记(我猜,级联删除不起作用,因为我从触发器a_delete_trigger返回null )

如何使,当我从a表中删除一条记录时,该记录被标记为已删除,并且b中相应的记录也被标记为已删除?

EN

回答 1

Stack Overflow用户

发布于 2018-09-21 17:44:26

将删除的b添加到a_delete_trigger。

代码语言:javascript
复制
create or replace function a_delete_trigger()
    returns trigger as
$$
begin
    update a
    set del = now()
    where id = old.id; -- mark row

    delete from b where a_id = a.id;

    return null; -- return null, so that the record is not removed from database
end;
$$
language plpgsql;
create trigger a_delete
    before delete
    on a
    for each row
execute procedure a_delete_trigger();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52440853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档