繁体   English   中英

使用 PL/PGSQL 从多个表中删除

[英]Delete from multiple tables using PL/PGSQL

我有 3 张桌子。 我想使用 postgresql function 通过仅提供film_person_id来从film_person表中删除相关角色、电影和所有其他剩余电影人。

我想做的是,当我调用delete_film_person2(15); 我想从film_person表中删除相关角色,即role_id: 23role_id: 24以及film_person_id: 15film_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM