2016-09-28 12 views
0

私はPostgres 9.5.0を使用しています。私は次のテーブルを持っていますPostgresでは、テーブルAの行が削除されたときにテーブルBから行を削除する方法はありますか?

myproject=> \d my_objects; 
            Table "public.my_objects" 
     Column  |   Type    |    Modifiers    
---------------------+-----------------------------+------------------------------------- 
name    | character varying   | 
day     | date      | 
distance   | double precision   | 
user_id    | integer      | 
created_at   | timestamp without time zone | not null 
updated_at   | timestamp without time zone | not null 
distance_unit_id | integer      | 
import_completed | boolean      | 
id     | character varying   | not null default uuid_generate_v4() 
linked_my_object_time_id | character varying   | 
web_crawler_id  | integer      | 
address_id   | character varying   | 
Indexes: 
    "my_objects_pkey" PRIMARY KEY, btree (id) 
    "index_my_objects_on_user_id_and_day_and_name" UNIQUE, btree (user_id, day, name) 
    "index_my_objects_on_user_id" btree (user_id) 
    "index_my_objects_on_web_crawler_id" btree (web_crawler_id) 
Foreign-key constraints: 
    "fk_rails_5287d445c0" FOREIGN KEY (address_id) REFERENCES addresses(id) ON DELETE CASCADE 
    "fk_rails_970b2325bf" FOREIGN KEY (distance_unit_id) REFERENCES distance_units(id) 
    "fk_rails_dda3297b57" FOREIGN KEY (linked_my_object_time_id) REFERENCES my_object_times(id) ON DELETE CASCADE 
    "fk_rails_ebd32625bc" FOREIGN KEY (web_crawler_id) REFERENCES web_crawlers(id) 
    "fk_rails_fa07601dff" FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE 

今、各my_objectにはアドレスフィールドがあります。私が望むのは、my_objectを削除すると、対応するアドレスエントリも削除されます。 my_objectsテーブルからaddress_idカラムを移動することなく、my_objectsテーブルからローを削除するときに対応するアドレスデータも削除されるように設定することは可能ですか?明らかに、私が設定した外来キーは、仕事を完了させません。

+0

? – redneb

+0

同じ 'adresses'エントリを参照する複数の' my_objects'エントリがある場合はどうなりますか? –

+0

アドレスごとに1つのmy_objectがあります。 my_objectsテーブルにアドレスを含めることにしますが、アドレス(ユーザー、イベントなど)を使用するオブジェクトの種類がありますので、すべてのアドレスが1つの場所にある場合は少しきれいに見えます。 – Dave

答えて

3

あなたは、トリガーでこれを行うことができます。その場合は、なぜテーブル `my_objects`にアドレス自体は含まれていませ

CREATE OR REPLACE FUNCTION remove_address() RETURNS trigger 
    LANGUAGE plpgsql AS 
$$BEGIN 
    DELETE FROM public.addresses WHERE id = OLD.address_id; 
    RETURN OLD; 
END;$$; 

CREATE TRIGGER remove_address 
    AFTER DELETE ON public.my_objects FOR EACH ROW 
    EXECUTE PROCEDURE remove_address() 
+0

"EXECUTE T​​RIGGER"で構文エラーが発生しましたが、 "EXECUTE PROCEDURE"が機能しました。 – Dave

+0

今すぐ修正する必要があります。 –

関連する問題