मैं पोस्टग्रेज 9.5.0 का उपयोग कर रहा हूं। मेरे पास निम्न तालिका है:

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
Dave 28 सितंबर 2016, 17:42
यदि ऐसा है, तो क्यों न पता ही तालिका my_objects में शामिल किया जाए?
 – 
redneb
28 सितंबर 2016, 17:44
क्या होगा यदि एक ही adresses प्रविष्टि को संदर्भित करने वाली एक से अधिक my_objects प्रविष्टियां हैं?
 – 
Laurenz Albe
28 सितंबर 2016, 17:50
प्रति पता केवल एक my_object है। मैं my_objects तालिका में पते शामिल करूंगा, लेकिन अन्य प्रकार की वस्तुएं हैं जो पते (उपयोगकर्ता, ईवेंट, आदि) का उपयोग करती हैं, इसलिए मुझे लगा कि यदि सभी पते एक ही स्थान पर हों तो यह थोड़ा साफ दिखाई देगा।
 – 
Dave
28 सितंबर 2016, 17:51
लेकिन फिर, आपको कैसे पता चलेगा कि कोई उपयोगकर्ता या ईवेंट एक ही पते का उपयोग नहीं करता है?
 – 
redneb
28 सितंबर 2016, 18:08
क्योंकि मैंने नीली गोली ली थी।
 – 
Dave
28 सितंबर 2016, 21:50

1 उत्तर

सबसे बढ़िया उत्तर

आप इसे ट्रिगर के साथ कर सकते हैं:

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()
3
Laurenz Albe 30 सितंबर 2016, 09:44
"EXECUTE TRIGGER" ने कुछ सिंटैक्स त्रुटियाँ उत्पन्न कीं, लेकिन "EXECUTE PROCEDURE" ने काम किया।
 – 
Dave
28 सितंबर 2016, 22:31
अब ठीक किया जाना चाहिए।
 – 
Laurenz Albe
30 सितंबर 2016, 09:44