11

テーブルの行のIDを変更するには?

お気に入り:

UPDATE table SET id=10 WHERE id=5;

しかし、そのIDでこのテーブルを参照する他のすべてのテーブルに変更をカスケードする方法は?

ほとんどの同じテーブルを持つ別のデータベースからデータをインポートする必要があるため、これを行いたいのですが、ID は異なります。したがって、ID が古いデータベースと一致する場合は、データを正しくインポートする方が簡単です。

4

2 に答える 2

11

次の 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

于 2013-03-07T11:45:58.070 に答える
3

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を参照してください。

于 2013-03-07T09:24:29.083 に答える