简体   繁体   English

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

[英]Delete from multiple tables using PL/PGSQL

I have 3 tables.我有 3 张桌子。 Which I want to use a postgresql function via giving only film_person_id to delete related roles, films and all other remaining film people from film_person table.我想使用 postgresql function 通过仅提供film_person_id来从film_person表中删除相关角色、电影和所有其他剩余电影人。

The thing I want to do is, when I call delete_film_person2(15);我想做的是,当我调用delete_film_person2(15); I want to delete related roles which is role_id: 23 and role_id: 24 also film_person_id: 15 and film_person_id: 16 from film_person table.我想从film_person表中删除相关角色,即role_id: 23role_id: 24以及film_person_id: 15film_person_id: 16

here are the tables;这是表格;

roles:角色:

角色

film_person:电影人:

电影人

top_level_films:顶级电影:

顶级电影

here is my function这是我的 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;
$$ 

but it gives error of;但它给出了错误;

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

changed f variable data type and added 2 more delete queries更改了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;
$$

You can do this with a single data modifying CTE您可以使用单个数据修改 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;

You wouldn't even need PL/pgSQL for this.你甚至不需要 PL/pgSQL。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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