PostgreSQL – 正确更改表行的ID

PostgreSQL – 正确更改表行的ID,第1张

概述如何更改某些表行的id? 喜欢: UPDATE table SET id=10 WHERE id=5; 但是,它会将更改级联到每个引用此表的其他表的更改? 我想这样做,因为我需要从具有大多数相同表的另一个数据库导入数据,但是ID不同.因此,如果id与旧数据库匹配,则更容易正确导入数据. 假设你有这两个表: create table referenced (id integer primary ke 如何更改某些表行的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_constraintset 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');

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

总结

以上是内存溢出为你收集整理的PostgreSQL – 正确更改表行的ID全部内容,希望文章能够帮你解决PostgreSQL – 正确更改表行的ID所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1164818.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存