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

Postgresqlへの自己参照レコードの挿入

    シーケンスからlast_valueを選択できます。これは、タイプserialを使用すると自動的に作成されます:

    create table test (
      id serial primary key,
      parent integer not null,
      foreign key (parent) references test(id)
    );
    
    insert into test values(default, (select last_value from test_id_seq));
    insert into test values(default, (select last_value from test_id_seq));
    insert into test values(default, (select last_value from test_id_seq));
    
    select * from test;
     id | parent
    ----+--------
      1 |      1
      2 |      2
      3 |      3
    (3 rows)
    

    そして、次のさらに単純なものも同様に機能するようです:

    insert into test values(default, lastval());
    

    複数のシーケンスを使用した場合にこれがどのように機能するかはわかりませんが...調べました。 lastval()は、任意のシーケンスへの最後のnextvalまたはsetval呼び出しで返された、または設定された最後の値を返すため、次の場合に問題が発生します。

    create table test (
      id serial primary key,
      foo serial not null,
      parent integer not null,
      foreign key (parent) references test(id)
    );
    
    select setval('test_foo_seq', 100);
    
    insert into test values(default, default, lastval());
    ERROR:  insert or update on table "test" violates foreign key constraint "test_parent_fkey"
    DETAIL:  Key (parent)=(101) is not present in table "test".
    

    ただし、次のことは問題ありません。

    insert into test values(default, default, currval('test_id_seq'));
    
    select * from test;
     id | foo | parent
    ----+-----+--------
      2 | 102 |      2
    (1 row)
    



    1. ORA-04063を解決する方法:ビューSYS.ALL_QUEUE_TABLESにエラーがありますか?

    2. INSERT IGNOREがauto_increment主キーをインクリメントするのはなぜですか?

    3. MySQL列からPHP配列を作成する

    4. 既存のスキーマからテーブル関係図を生成する(SQL Server)