テーブルの行のIDを変更するには?
お気に入り:
UPDATE table SET id=10 WHERE id=5;
しかし、そのIDでこのテーブルを参照する他のすべてのテーブルに変更をカスケードする方法は?
ほとんどの同じテーブルを持つ別のデータベースからデータをインポートする必要があるため、これを行いたいのですが、ID は異なります。したがって、ID が古いデータベースと一致する場合は、データを正しくインポートする方が簡単です。
テーブルの行のIDを変更するには?
お気に入り:
UPDATE table SET id=10 WHERE id=5;
しかし、そのIDでこのテーブルを参照する他のすべてのテーブルに変更をカスケードする方法は?
ほとんどの同じテーブルを持つ別のデータベースからデータをインポートする必要があるため、これを行いたいのですが、ID は異なります。したがって、ID が古いデータベースと一致する場合は、データを正しくインポートする方が簡単です。
次の 2 つのテーブルがあるとします。
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
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)
);
詳細については、http://www.postgresql.org/docs/current/static/ddl-constraints.htmlを参照してください。