And*_*ius 9 postgresql postgresql-9.2
如何更改某些表行的id?
喜欢:
UPDATE table SET id=10 WHERE id=5;
Run Code Online (Sandbox Code Playgroud)
但是,它会将更改级联到每个引用此表的其他表的更改?
我想这样做,因为我需要从另一个具有大多数相同表的数据库导入数据,但是ID不同.因此,如果id与旧数据库匹配,则更容易正确导入数据.
Clo*_*eto 10
假设你有这两个表:
create table referenced (id integer primary key);
create table referencer (a integer references referenced (id));
Run Code Online (Sandbox Code Playgroud)
引用的表引用器引用表:
=> \d referencer
Table "public.referencer"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
Foreign-key constraints:
"referencer_a_fkey" FOREIGN KEY (a) REFERENCES referenced(id)
Run Code Online (Sandbox Code Playgroud)
然后在两者中插入一个值:
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
Run Code Online (Sandbox Code Playgroud)
现在您要将引用更改为on update cascade:
alter table referencer
drop constraint referencer_a_fkey,
add foreign key (a) references referenced (id) on update cascade;
Run Code Online (Sandbox Code Playgroud)
并更新它:
update referenced set id = 2;
select *
from
referenced rd
inner join
referencer rr on rd.id = rr.a
;
id | a
----+---
2 | 2
Run Code Online (Sandbox Code Playgroud)
现在,如果已更新的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'
);
Run Code Online (Sandbox Code Playgroud)
它会将引用表上的所有外键约束更改为 on update cascade
您将需要更改外键并将ON UPDATE操作设置为CASCADE。当您更改值时,所有关联的值也会更改。
这是如何定义它的示例:
CREATE TABLE order_items (
product_no integer REFERENCES products ON UPDATE CASCADE,
order_id integer REFERENCES orders ON UPDATE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
);
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅http://www.postgresql.org/docs/current/static/ddl-constraints.html
| 归档时间: |
|
| 查看次数: |
9362 次 |
| 最近记录: |