PostgreSQL-正确地改变表行的ID[英] PostgreSQL - properly change ID of table row

本文是小编为大家收集整理的关于PostgreSQL-正确地改变表行的ID的处理方法,想解了PostgreSQL-正确地改变表行的ID的问题怎么解决?PostgreSQL-正确地改变表行的ID问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

如何修改某表行的id?

喜欢:

UPDATE table SET id=10 WHERE id=5;

但是,它会将更改级联到使用该 ID 引用此表的所有其他表吗?

我想这样做,因为我需要从另一个数据库中导入数据,该数据库具有大部分相同的表,但 id 不同.因此,如果 ids 可以匹配旧数据库,那么正确导入数据会更容易.

推荐答案

假设你有这两张表:

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

现在如果更新的 id 已经存在,那么在引用的表主键中会出现另一个问题.但这会产生另一个问题.

更新

这很危险,所以先备份数据库.必须以超级用户身份完成:

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

本文地址:https://www.itbaoku.cn/post/1763758.html