sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL-テーブル行の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に変更されます。



    1. Ubuntu20.04にPostgreSQLをインストールします

    2. SQL ServerのFORMAT()でサポートされている標準の日付/時刻形式の文字列

    3. MySQLのテーブルをOracleのテーブルと結合する方法

    4. RailsTutorial 3.2Ch11-PostgreSQL構文エラーがステータスフィードを壊す