加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL – 正确更改表行的ID

发布时间:2020-12-13 16:14:55 所属栏目:百科 来源:网络整理
导读:如何更改某些表行的id? 喜欢: UPDATE table SET id=10 WHERE id=5; 但是,它会将更改级联到每个引用此表的其他表的更改? 我想这样做,因为我需要从具有大多数相同表的另一个数据库导入数据,但是ID不同.因此,如果id与旧数据库匹配,则更容易正确导入数据. 假
如何更改某些表行的id?

喜欢:

UPDATE table SET id=10 WHERE id=5;

但是,它会将更改级联到每个引用此表的其他表的更改?

我想这样做,因为我需要从具有大多数相同表的另一个数据库导入数据,但是ID不同.因此,如果id与旧数据库匹配,则更容易正确导入数据.

假设你有这两个表:
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

现在您要更改对更新级联的引用:

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

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

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'
);

它会将引用表上的所有外键约束更改为更新级联

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读