2016-12-13 16 views
1

私がしたいのはtable 1から行を削除し、行から削除し、外字キーで参照されたtable 1の行を削除することです。テーブル2の外来キーを削除してon delete cascadeで再作成せずにこれを実行できるかどうかを知りたい。テーブルからどのように削除すると削除された行を参照して削除するには? (postgresql)

私はSQLにうまくやっていないし、3つの異なるアサーションを成功させることなく試みました。

1:

delete from table1 a, table2 b where a.table2_id = b.id and a.column < 0; 

2一度に複数のテーブルから削除しようとすると:選択からアレイを作成および削除するためにそれを使用する:リターン

delete from table2 where id in 
    (delete from table1 where column < 0 returning table2_id as id); 

3で削除両方のテーブルから

DECLARE 
    arr integer[] := array(select table2_id from table1 where column < 0); 
BEGIN 
    FOREACH m SLICE 1 IN ARRAY arr 
    LOOP 
     delete from table1 where table2_id = m; 
     delete from table2 where id = m; 
    END LOOP; 
END 

答えて

2

あなたは、この機能が動作するように内側にする必要もありません書き込み可能なCTE

with t1_deleted as (
    delete from table1 where column < 0 
    returning table2_id as id 
) 
delete from table2 
where id in (select id from t1_deleted); 
+0

ありがとうございました。 –

1

削除を並べ替えることができる場合は、これを行うことができます。

以下の機能をお試しください。

create table schema_name.table_name1 (id serial primary key, name text) 
create table schema_name.table_name2(id bigint references schema_name.table_name1(id), mno bigint) 

create or replace function schema_name.fn_test_f_k() returns void as $$ 
DECLARE 
    c1 cursor for select id from schema_name.table_name1 where id = 1; 
BEGIN 
    for r IN c1 
    LOOP 
     delete from schema_name.table_name2 where id = r.id; 
     delete from schema_name.table_name1 where id = r.id; 
    END LOOP; 
END 
$$ 
LANGUAGE PLPGSQL SECURITY DEFINER; 

select schema_name.fn_test_f_k(); 
+0

を使用して、単一のステートメントでこれを行うことができます。 –

+0

関数を使用しないdeleteクエリを使用するには、where条件で削除する行だけを指定します。 –

+0

ちょうどあなたは最初に外部キーテーブル(テーブル2) –

関連する問題