簡體   English   中英

Postgres級聯刪除與觸發器

[英]Postgres cascade delete with trigger

我有以下數據庫結構:

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的相應標志用小寫(但實際上不從數據庫中刪除記錄)。

為此,我編寫了一個觸發器:

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的觸發器:

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 = ? )時,該記錄被標記為已刪除(標志del包含時間戳記),但是未標記表b中的適當記錄(我猜這是級聯刪除)不起作用,因為我從觸發器a_delete_trigger返回null)

我該如何做,當我從表a刪除一條記錄時,該記錄標記為已刪除,而b相應記錄也將標記為已刪除?

將刪除b添加到a_delete_trigger。

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM