[英]Delete from multiple tables using PL/PGSQL
我有 3 张桌子。 我想使用 postgresql function 通过仅提供film_person_id
来从film_person
表中删除相关角色、电影和所有其他剩余电影人。
我想做的是,当我调用delete_film_person2(15);
我想从film_person
表中删除相关角色,即role_id: 23
和role_id: 24
以及film_person_id: 15
和film_person_id: 16
。
这是表格;
角色:
电影人:
顶级电影:
这是我的 function
create or replace function delete_film_person2(int)
returns varchar
language plpgsql
as
$$
declare
result varchar;
f int;
basket_film_id int;
begin
select top_level_film_id into basket_film_id from roles where film_person_id = $1;
for f in select film_person_id from roles where top_level_film_id = basket_film_id
loop
delete from film_person where film_person_id = f.film_person_id;
end loop;
result = 'success';
return result;
end;
$$
但它给出了错误;
ERROR: missing FROM-clause entry for table "f"
LINE 1: f.film_person_id
^
QUERY: f.film_person_id
CONTEXT: delete_film_person2(integer) PL/pgSQL fonksiyonu, 12. satır, RAISE içinde
SQL state: 42P01
更改了f
变量数据类型并添加了 2 个delete
查询
returns varchar
language plpgsql
as
$$
declare
result varchar;
f record;
fp_people record;
basket_film_id int;
begin
select top_level_film_id into basket_film_id from roles where film_person_id = $1;
for f in select roles.film_person_id from roles where roles.top_level_film_id = basket_film_id
loop
delete from film_person where film_person.film_person_id = f.film_person_id;
end loop;
delete from roles where top_level_film_id = basket_film_id;
delete from top_level_films where film_id = basket_film_id;
result = 'success';
return result;
end;
$$
您可以使用单个数据修改 CTE来执行此操作
create or replace function delete_film_person2(p_film_person_id int)
returns varchar
as
$$
begin
with deleted_roles as (
delete from roles
where film_person_id = p_film_person_id
returning top_level_film_id
), deleted_films as (
delete from top_level_films
where film_id in (select top_level_film_id
from delete_roles)
)
delete from film_person
where film_person_id = p_film_person_id;
return 'success';
end;
$$
language plpgsql;
你甚至不需要 PL/pgSQL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.