[英]Postgres cascade delete with trigger
I have following database structure: 我有以下数据库结构:
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
);
When deleting a record from table a
, I want to set the del
flag at the current time and cascase the corresponding flag in table b
( but not delete records from database actually). 从表
a
删除记录时,我想在当前时间设置del
标志,并将表b
的相应标志用小写(但实际上不从数据库中删除记录)。
For it, I write a trigger: 为此,我编写了一个触发器:
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();
And a trigger for table b
: 和表
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();
When I delete a record from table a
( delete from a where id = ?
) , the record is marked as deleted ( the flag del
contains timestamp), but appropriate records from table b
are not marked (I'm guessing, that cascade delete not work, because I return null from trigger a_delete_trigger
) 当我从表
a
删除一条记录( delete from a where id = ?
)时,该记录被标记为已删除(标志del
包含时间戳记),但是未标记表b
中的适当记录(我猜这是级联删除)不起作用,因为我从触发器a_delete_trigger
返回null)
How do I make, that when I delete a record from table a
, the record marks as deleted, and corresponding records in b
will marked as deleted too? 我该如何做,当我从表
a
删除一条记录时,该记录标记为已删除,而b
相应记录也将标记为已删除?
Add the delete b to the a_delete_trigger. 将删除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.