PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

विदेशी कुंजियों को बदलने के लिए इनहेरिट की गई तालिकाओं पर ट्रिगर का उपयोग करें

पहले कुछ इस तरह से FK से छुटकारा पाएं:

alter table address drop constraint address_person_id_fkey

अगर वह शिकायत करता है कि कोई address_person_id_fkey नहीं है बाधा तब \d address; . का उपयोग करें psql . में यह पता लगाने के लिए कि FK क्या कहलाता है।

फिर इस तरह के एक साधारण ट्रिगर को चाल चलनी चाहिए:

create or replace function pseudo_fk_for_address() returns trigger as $$
begin
    if not exists(select 1 from person where id = new.person_id) then
        raise exception 'No such person: %', new.person_id;
    end if;
    return new;
end;
$$ language plpgsql;

और इसे इस तरह संलग्न करें:

प्रत्येक पंक्ति निष्पादन प्रक्रिया के लिए पते पर डालने या अपडेट करने से पहले
create trigger pseudo_fk_for_address_trigger before insert or update on address 
for each row execute procedure pseudo_fk_for_address();

फिर आपको इस तरह की त्रुटि मिलेगी यदि आप किसी ऐसे व्यक्ति के लिए पता जोड़ने का प्रयास करते हैं जो person में मौजूद नहीं है (इससे प्राप्त होने वाली तालिकाओं सहित):

playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR:  No such person: 3

आप person . में DELETE ट्रिगर से पहले एक जोड़ना चाहेंगे लटकने वाले संदर्भों से बचने के लिए, मूल संरचना काफी समान होगी। आप address.person_id . पर एक अनुक्रमणिका चाहते हैं DELETE ट्रिगर से पहले का भी समर्थन करने में मदद करने के लिए।

संदर्भ:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pgbouncer के साथ लेनदेन पूलिंग का उपयोग करने के क्या फायदे हैं?

  2. शब्द को शांत करने का सबसे आसान तरीका पोस्टग्रेएसक्यूएल में अनुक्रमित नोटिस होने के लिए बहुत लंबा है

  3. Postgres में फ़ंक्शन ओवरलोडिंग को अक्षम करने का कोई तरीका है

  4. मेरा पसंदीदा पोस्टग्रेएसक्यूएल एक्सटेंशन - भाग दो

  5. पूर्णांक सीमा से बाहर है और शेष डिस्क स्थान आईडी को बिगिंट और अन्य समाधानों में बदलने के लिए बहुत छोटा है