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

PostgreSQL - तालिका पंक्ति की आईडी को ठीक से बदलें

मान लीजिए आपके पास ये दो टेबल हैं:

create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));

तालिका संदर्भकर्ता संदर्भ तालिका संदर्भित:

=> \d referencer
  Table "public.referencer"
 Column |  Type   | Modifiers 
--------+---------+-----------
 a      | integer | 
Foreign-key constraints:
    "referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)

फिर आप दोनों में एक मान डालें:

insert into referenced values (1);
insert into referencer values (1);

select *
from
    referenced rd
    inner join
    referencer rr on rd.id = rr.a
;
 id | a 
----+---
  1 | 1

अब आप संदर्भ को on update cascade . में बदलना चाहते हैं :

alter table referencer
    drop constraint referencer_a_fkey,
    add foreign key (a) references referenced (id) on update cascade;

और इसे अपडेट करें:

update referenced set id = 2;

select *
from
    referenced rd
    inner join
    referencer rr on rd.id = rr.a
;
 id | a 
----+---
  2 | 2

अब आपको संदर्भित तालिका प्राथमिक कुंजी में एक और समस्या होगी यदि अद्यतन आईडी पहले से मौजूद है। लेकिन इससे एक और सवाल खड़ा हो जाएगा।

अपडेट करें

यह खतरनाक है इसलिए पहले डीबी का बैकअप लें। इसे सुपरयूज़र के रूप में किया जाना चाहिए:

update pg_constraint
set confupdtype = 'c'
where conname in (
    select
        c.conname
    from
        pg_constraint c
        inner join
        pg_class referenced on referenced.oid = c.confrelid
    where
        referenced.relname = 'referenced'
        and
        c.contype = 'f'
);

यह संदर्भित तालिका पर सभी विदेशी कुंजी बाधाओं को on update cascade . में बदल देगा



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं सीधे jsonb_array_elements पर क्वेरी क्यों नहीं कर सकता?

  2. किसी अन्य तालिका से एक पंक्ति का संदर्भ देना (PostgreSQL)

  3. Postgresql में अंतर्राष्ट्रीयकृत नियमित अभिव्यक्ति

  4. पीजी-वादा:लेन-देन के भीतर अगली क्वेरी में एक क्वेरी के परिणाम का उपयोग करें

  5. PostgreSQL के साथ टेबल मर्ज करें